news 2026/5/1 14:22:37

基于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/5/1 6:56:36

jQuery 添加元素

jQuery 添加元素 在网页开发中,jQuery 是一种广泛使用的JavaScript库,它简化了HTML文档遍历、事件处理、动画和AJAX操作。其中,jQuery 提供了多种方法来添加元素到DOM中。本文将详细介绍jQuery添加元素的相关知识,包括方法、语法和示例。 1. jQuery 添加元素的方法 jQue…

作者头像 李华
网站建设 2026/5/1 7:56:58

VMD-SE-LSTM+Transformer多变量时序预测,MATLAB代码

一、研究背景 时序预测复杂性&#xff1a;传统单一模型难以捕捉时间序列中的非平稳、多尺度特征。混合模型优势&#xff1a;结合信号分解技术与深度学习模型&#xff0c;能有效提取时序中的高低频信息。VMD&#xff08;变分模态分解&#xff09;&#xff1a;适用于非平稳信号分…

作者头像 李华
网站建设 2026/5/1 7:50:33

jEasyUI 创建子网格

jEasyUI 创建子网格 引言 jEasyUI 是一款流行的 jQuery UI 组件库,它提供了丰富的 UI 组件和交互效果,极大地方便了前端开发。在 jEasyUI 中,子网格(Subgrid)是一个非常有用的功能,它允许用户在一个网格中嵌套另一个网格。本文将详细介绍如何使用 jEasyUI 创建子网格,…

作者头像 李华
网站建设 2026/5/1 11:47:21

9.2 太牛了!通用消息协议竟然这样设计?

太牛了!通用消息协议竟然这样设计? 在WebSocket网关中,设计一个通用、灵活且高效的消息协议是至关重要的。一个好的消息协议不仅要满足当前业务需求,还要具备良好的扩展性,以适应未来可能的变化。本章将深入探讨如何设计一个优秀的通用消息协议。 1. 消息协议设计原则 …

作者头像 李华
网站建设 2026/5/1 10:36:37

11.1 重大突破!网关高可用方案原来是这样设计的?

重大突破!网关高可用方案原来是这样设计的? WebSocket网关作为实时通信系统的核心组件,其高可用性设计直接关系到整个系统的稳定性和用户体验。一个优秀的高可用网关方案需要考虑多个方面,包括服务部署、负载均衡、故障检测、自动恢复等。本章将深入探讨如何设计和实现高可…

作者头像 李华