当前位置: > 财经>正文

C# SerialPort串口接收 丢数据 数据不完整的解决方法 外汇托管保险本金不赔怎么办理的呢视频

2023-08-19 06:28:44 互联网 未知 财经

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 

版权声明: 本站仅提供信息存储空间服务,旨在传递更多信息,不拥有所有权,不承担相关法律责任,不代表本网赞同其观点和对其真实性负责。如因作品内容、版权和其它问题需要同本网联系的,请发送邮件至 举报,一经查实,本站将立刻删除。