当前位置: > 财经>正文
C# SerialPort串口接收 丢数据 数据不完整的解决方法 外汇托管保险本金不赔怎么办理的呢视频
C# SerialPort的 DataReceived事件,可能是存在问题,使用时,数据丢失,造成数据不完整。
解决方法思路:
使用独立线程读取数据,把串口缓冲区的数据,读取到程序中。抛开DataReceived事件。
使用其它线程获取“串口中读取的数据”再进行解析。
客户程序由被动触发,改为主动获取。
相关变量、对象
C# Code 123456789101112131415161718192023222324 /// /// 保持读取开关/// bool _keepReading;/// /// 检测频率【检测等待时间,毫秒】【按行读取,可以不用】/// int _jcpl = 1;/// /// 串口/// SerialPort _sp = new SerialPort();/// /// 字符串队列【.NET Framework 4.0以上】/// ConcurrentQueue _cq = new ConcurrentQueue();/// /// 字节数据队列/// ConcurrentQueue _cqBZ = new ConcurrentQueue();
串口读取方法【ViewCommStatus,自定义方法,串口读取状态输出】
C# Code 1234567891011121314151617181920232223242526272829303132333435363738394041424344454647484950515253545556 /// /// 串口读取方法/// void SerialPortRead(){ while (_keepReading) { if (_jcpl > 0)//按行读取可以省略 { Thread.Sleep(_jcpl); } if (_sp == null) { ViewCommStatus(false, "串口对象未实例化!"); Thread.Sleep(3000);//3秒后重新检测 continue; } if (!_sp.IsOpen) { ViewCommStatus(false, "串口未打开"); Thread.Sleep(3000); continue; }try { #region 按行读取 string buffer = _sp.ReadLine(); if (!string.IsNullOrEmpty(buffer))//可以不加判断,允许添加null值,数据解析时,再做判断。 { _cq.Enqueue(buffer); } #endregion
//#region 字节读取 //byte[] readBuffer = new byte[_sp.ReadBufferSize + 1]; //int count = _sp.Read(readBuffer, 0, _sp.ReadBufferSize); //if (count != 0) //{ // _cqBZ.Enqueue(readBuffer); //} //#endregion ViewCommStatus(true, "串口通信正常"); } catch (TimeoutException)//注意超时时间的定义 { ViewCommStatus(false, "串口读取超时!"); } catch (Exception ex)//排除隐患后可以去掉。 { ViewCommStatus(false, "串口读取异常:" + ex.Message); }
}}
数据解析方法
C# Code 1234567891011121314151617181920232223242526272829303132333435363738394041 /// /// 数据解析/// void DataAnalysis(){ while (true) { Thread.Sleep(10);if (_cq.IsEmpty) { continue; }
#region 按行读取 for (int i = 0; i
版权声明: 本站仅提供信息存储空间服务,旨在传递更多信息,不拥有所有权,不承担相关法律责任,不代表本网赞同其观点和对其真实性负责。如因作品内容、版权和其它问题需要同本网联系的,请发送邮件至 举报,一经查实,本站将立刻删除。