当前位置: 首页 > news >正文

基于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. 性能监控指标

    • 串口缓冲区占用率

    • 数据处理延迟

    • 异常发生频率

http://www.jsqmd.com/news/363047/

相关文章:

  • 2026市场调研优质品牌推荐榜 助力企业决策 - 优质品牌商家
  • Robotics Toolbox for MATLAB
  • 光亚鸿道子公司科东软件荣获国家级专精特新“小巨人”企业授牌
  • Chapter14—中介者模式 - 教程
  • 统领工业 “智能大脑”,以根技术开启自主控制新纪元
  • ANELLO Photonics 与 Delta Black Aerospace 展开合作
  • GP8501 PWM转0-2.5V模拟电压模块原理图设计,已量产
  • 职业教育的“风口”已变!职业教育相关从业者,这波红利你赶上了吗?
  • Java毕设项目推荐-基于 SpringBoot 的高校办公室行政事务管理系统设计与实现基于springboot的校园行政事务审批服务系统的设计与开发【附源码+文档,调试定制服务】
  • VMD-SE-LSTM+Transformer多变量时序预测,MATLAB代码
  • GP8503 I2C转0-2.5V模拟电压模块原理图设计,已量产
  • Java毕设项目:基于springboot的校园行政事务审批服务系统的设计与开发(源码+文档,讲解、调试运行,定制等)
  • 手把手教你在Win10上为Vibe Writing项目搭建Claude Code环境
  • 软件工程专业毕业设计选题方向汇总(2026最新版|含难度分级+技术栈)
  • #车载测试:基于Python与CAPL的程控电源协同控制方案
  • 2026年市场调查优质机构推荐榜:第三方市场调查机构推荐/第三方市场调查机构推荐/第三方市场调研公司推荐/选择指南 - 优质品牌商家
  • jQuery 添加元素
  • SAP S4HANA 2025 FAA虚拟机介绍
  • c++-—
  • 免费网站模板下载网站
  • ue5 正确关闭自动曝光
  • 职教数字化八年观察:当代码成为产教融合的“隐形桥梁”
  • Solution - P5471 [NOI2019] 弹跳
  • Excel条件格式高级应用:动态图标集标记成绩与平均分比较
  • 防冻液优质厂家推荐及选购指南 - 优质品牌商家
  • [python]-LangChain
  • Java毕设项目推荐-基于Spring Boot的社区便民服务管理系统的设计与实现基于springboot的在线社区系统的设计与开发【附源码+文档,调试定制服务】
  • 数字模型赋能大规模设计,连通城市与河流
  • 铁木辛柯梁振动分析仿真 COMSOL案例还原及 此模型研究深梁的自由振动和强迫振动
  • [Informatics] (Legacy) CodeForces + Atcoder 问题几则