news 2026/2/9 22:39:42

基于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/2/9 22:37:35

Java毕设项目推荐-基于 SpringBoot 的高校办公室行政事务管理系统设计与实现基于springboot的校园行政事务审批服务系统的设计与开发【附源码+文档,调试定制服务】

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

作者头像 李华
网站建设 2026/2/9 22:33:46

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

目录 1、输入接口:双路 PWM 信号接入 2、参考电压切换:灵活适配输出范围 3、使能控制:抗干扰的电平设计 4、输出滤波与保护:平滑与防护的双重保障 5、输出接口:标准化的信号引出 在嵌入式系统开发中,我们常面临这样的场景:主控 MCU 仅具备 PWM 脉冲输出能力,却需要…

作者头像 李华
网站建设 2026/2/9 22:28:31

让游戏本画面更丝滑,可变刷新频率有多香~

很多宝子想让游戏本画面更丝滑、不撕裂、不卡顿&#xff0c;却不知道可变刷新频率&#xff08;VRR&#xff09; 有多香&#xff5e;到底什么是 VRR&#xff1f;笔记本该怎么开启&#xff1f;超清晰教程都整理在长图里啦&#x1f447;追求极致流畅游戏 / 视觉体验的宝子&#xf…

作者头像 李华
网站建设 2026/2/9 22:22:53

工厂产品良率低怎么办?关键在于制造过程

作为一线工厂的管理者&#xff0c;可能早已对“良率”二字耳熟能详。它不仅是客户验厂时反复追问的核心指标&#xff0c;更是直接影响利润、交付甚至企业生存的关键变量。然而&#xff0c;当良率持续低迷、波动频繁&#xff0c;您是否也曾陷入这样的困境&#xff1a; 质量问题…

作者头像 李华
网站建设 2026/2/9 22:15:29

10352_基于Springboot的房屋销售平台

1、项目包含项目源码、项目文档、数据库脚本、软件工具等资料&#xff1b;带你从零开始部署运行本套系统。2、项目介绍随着科学技术和信息通讯的飞速发展&#xff0c;Internet极大的丰富和改变着我们生活的各个行业。随着Internet的普及应用&#xff0c;人们可以跨越时间和空间…

作者头像 李华
网站建设 2026/2/9 22:12:15

14.2 自定义DSL和循环依赖检测竟然还能这样做?

14.2 震撼!自定义DSL和循环依赖检测竟然还能这样做? 在上一节中,我们讨论了任务编排和规则引擎的基本概念和实现。今天我们将深入探讨两个关键技术点:自定义DSL的设计与实现,以及循环依赖检测机制。这些技术将使我们的任务调度系统更加灵活和健壮。 自定义DSL设计与ANTL…

作者头像 李华