news 2026/4/27 21:03:25

基于C#实现多线程串口通信

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
基于C#实现多线程串口通信

一、核心架构设计

主线程

SerialPortManager

接收线程

发送线程

数据缓冲队列

数据处理线程


二、关键代码实现

1. 串口管理类(线程安全封装)
usingSystem.IO.Ports;usingSystem.Threading;usingSystem.Collections.Concurrent;publicclassSerialPortManager:IDisposable{privateSerialPort_serialPort;privateThread_readThread;privateThread_writeThread;privateConcurrentQueue<byte[]>_dataQueue=newConcurrentQueue<byte[]>();privateAutoResetEvent_writeEvent=newAutoResetEvent(false);privateSemaphoreSlim_serialLock=newSemaphoreSlim(1,1);publiceventAction<byte[]>DataReceived;publicSerialPortManager(stringportName,intbaudRate){InitializePort(portName,baudRate);StartThreads();}privatevoidInitializePort(stringportName,intbaudRate){_serialPort=newSerialPort(portName,baudRate){Parity=Parity.None,DataBits=8,StopBits=StopBits.One,ReadTimeout=500,WriteTimeout=500};_serialPort.DataReceived+=(s,e)=>{varbuffer=newbyte[_serialPort.BytesToRead];_serialPort.Read(buffer,0,buffer.Length);_dataQueue.Enqueue(buffer);DataReceived?.Invoke(buffer);};}privatevoidStartThreads(){_readThread=newThread(ProcessIncomingData);_writeThread=newThread(ProcessOutgoingData);_readThread.Start();_writeThread.Start();}publicasyncTaskSendDataAsync(byte[]data){await_serialLock.WaitAsync();try{_writeEvent.Set();_serialPort.Write(data,0,data.Length);}finally{_serialLock.Release();}}privatevoidProcessIncomingData(){while(!_serialPort.IsOpen)Thread.Sleep(100);while(true){if(_dataQueue.TryDequeue(outvardata)){// 数据解析逻辑ParseData(data);}Thread.Sleep(10);}}privatevoidProcessOutgoingData(){while(true){_writeEvent.WaitOne();// 发送队列处理逻辑}}privatevoidParseData(byte[]data){// 实现具体协议解析}publicvoidDispose(){_serialLock.Dispose();_writeEvent.Dispose();_serialPort?.Close();_serialPort?.Dispose();}}

三、线程同步机制

1. 双缓冲队列设计
privateConcurrentQueue<byte[]>_readBuffer=newConcurrentQueue<byte[]>();privateConcurrentQueue<byte[]>_processBuffer=newConcurrentQueue<byte[]>();// 数据接收线程voidReceiveThread(){while(true){if(_serialPort.BytesToRead>0){varbuffer=newbyte[_serialPort.BytesToRead];_serialPort.Read(buffer,0,buffer.Length);_readBuffer.Enqueue(buffer);}Thread.Sleep(1);}}// 数据处理线程voidProcessThread(){while(true){if(_readBuffer.TryDequeue(outvardata)){_processBuffer.Enqueue(ProcessData(data));}}}
2. 异步读写实现
publicasyncTask<byte[]>ReadAsync(CancellationTokenct){await_serialLock.WaitAsync(ct);try{varbuffer=newbyte[1024];intbytesRead=await_serialPort.BaseStream.ReadAsync(buffer,0,buffer.Length,ct);Array.Resize(refbuffer,bytesRead);returnbuffer;}finally{_serialLock.Release();}}publicasyncTaskWriteAsync(byte[]data,CancellationTokenct){await_serialLock.WaitAsync(ct);try{await_serialPort.BaseStream.WriteAsync(data,0,data.Length,ct);}finally{_serialLock.Release();}}

四、异常处理

1. 异常捕获框架
publicvoidSafeWrite(byte[]data){try{_serialLock.Wait();_serialPort.Write(data,0,data.Length);}catch(TimeoutExceptionex){HandleTimeout();}catch(IOExceptionex){HandleDeviceDisconnect();}finally{_serialLock.Release();}}
2. 自动重连机制
privatevoidHandleDeviceDisconnect(){_serialLock.Wait();try{if(_serialPort.IsOpen)_serialPort.Close();Thread.Sleep(1000);ReinitializePort();}finally{_serialLock.Release();}}privatevoidReinitializePort(){InitializePort(_config.PortName,_config.BaudRate);StartThreads();}

参考代码 c#编写串口通讯代码多线程www.youwenfan.com/contentcsr/111962.html

五、性能优化

1. 内存池管理
privateObjectPool<byte[]>_bufferPool=newObjectPool<byte[]>(()=>newbyte[1024],10);byte[]GetBuffer()=>_bufferPool.Get();voidReturnBuffer(byte[]buffer)=>_bufferPool.Return(buffer);
2. 批量数据处理
publicvoidProcessBatchData(IEnumerable<byte[]>dataArray){Parallel.ForEach(dataArray,data=>{varparsed=ParseData(data);lock(_processedData){_processedData.Add(parsed);}});}

六、完整使用示例

varmanager=newSerialPortManager("COM3",115200);// 异步发送数据awaitmanager.SendDataAsync(Encoding.UTF8.GetBytes("Hello"));// 接收回调处理manager.DataReceived+=(data)=>{vartext=Encoding.UTF8.GetString(data);Console.WriteLine($"Received:{text}");};// 后台数据处理Task.Run(()=>{while(true){if(manager.TryDequeueProcessedData(outvardata)){UpdateUI(data);}}});

七、调试与监控

1. 日志记录
publicvoidLogCommunication(stringmessage){lock(_logLock){File.AppendAllText("com_log.txt",$"{DateTime.Now:HH:mm:ss.fff}-{message}{Environment.NewLine}");}}
2. 实时状态监控
publicclassSerialStatus{publicintBytesSent{get;privateset;}publicintBytesReceived{get;privateset;}publicvoidIncrementSent(intcount)=>BytesSent+=count;publicvoidIncrementReceived(intcount)=>BytesReceived+=count;}

八、扩展功能实现

1. 协议解析器
publicclassModbusParser{publicstaticDictionary<byte,ushort>ParseFrame(byte[]data){// 实现Modbus RTU协议解析returnnewDictionary<byte,ushort>();}}
2. 加密传输
publicclassSecureSerialPort{privateAes_aes=Aes.Create();publicbyte[]Encrypt(byte[]data){using(varencryptor=_aes.CreateEncryptor())using(varms=newMemoryStream()){cs.Write(data,0,data.Length);returnms.ToArray();}}}

九、最佳实践建议

  1. 线程模型选择

    • 优先使用Task替代传统Thread

    • 高频数据采用BlockingCollection实现生产者-消费者模式

  2. 资源管理规范

    using(varmanager=newSerialPortManager()){// 自动释放资源}
  3. 性能监控指标

    • 串口缓冲区占用率

    • 数据处理延迟

    • 异常发生频率

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/25 23:30:07

#车载测试:基于Python与CAPL的程控电源协同控制方案

精准的电源控制,是车载ECU测试稳定与高效的基石。 本文将探讨一种在车载测试中,通过 Python 与 CAPL 协同控制程控电源的解决方案。该方案旨在绕过传统 RS232 协议的某些限制,利用 TCP/IP 网络协议实现更灵活、高效的电源控制,特别适用于对时序有严格要求的测试场景。 整体…

作者头像 李华
网站建设 2026/4/25 23:34:13

GP8503 I2C转0-2.5V模拟电压模块原理图设计,已量产

目录 1、电源与输出保护子电路 2、I2C 通信接口设计 3、核心芯片 GP8503 功能解析 在嵌入式系统开发中,ESP32、树莓派 Pico、STM32F103 等主流主控要么缺乏原生 DAC 外设,要么 DAC 分辨率、精度无法满足高精度模拟输出需求。本文将基于一款基于 GP8503 芯片的双路 12bit D…

作者头像 李华
网站建设 2026/4/17 18:27:04

Ruby 模块(Module)

Ruby 模块(Module) 引言 在Ruby编程语言中,模块(Module)是一种非常重要的特性,它使得代码的复用和抽象变得极为方便。模块可以看作是一种包含方法、常量和类定义的容器。通过使用模块,我们可以组织代码,避免命名冲突,并且能够灵活地将功能组合到类中。本文将详细介绍…

作者头像 李华
网站建设 2026/4/27 16:43:12

Pandas 简介

Pandas 简介 引言 在数据分析领域,Pandas 是一个极为重要的 Python 库。它提供了一系列的数据结构和数据分析工具,使得数据处理和分析变得更加简单、高效。本文将详细介绍 Pandas 库的基本概念、功能以及应用场景。 一、Pandas 库概述 Pandas 是一个开源的 Python 库,由…

作者头像 李华