• 串口通信之DataReceive事件触发时机


    环境:Windows PC、本机虚拟COM2连接COM3、串口调试助手COM2发数据

    图1

     

    1> ReceivedBytesThreshold为默认值1;2> 一次发送41个字节;3> 每次只读6个字节;4> DataReceive事件被触发2次,读了2次6个字节即12字节数据;6> 一段时间后,有2个线程退出。

    如上,把读取数据字节数6改成50,则DataReceive事件被触发1次,读了1次41字节数据。

    结论:1>如果接收缓冲区数据被一次读完,则DataReceive事件仅被触发一次,如1次没读完,则事件会被触发2次。(一次发送200字节也是如此)

    疑惑:1>DataReceive事件被触发时机? 2>这里的2个线程分别干了什么?

    前提:此结论是在pc机上内连的,如果与下位机串口通信,发送端发送200字节,接收端不一定一帧收完,可能多帧,而每帧字节数大于ReceivedBytesThreshold时触发一次DataReceive事件吧。

    图2

    1> ReceivedBytesThreshold设为5;2> 一次发送2个字节;3> 每次所有个字节;4> DataReceive事件要发送3次2个字节才被触发,触发时一次读取所有字节数据。

    综上所述,我猜DataReceive事件触发时机的代码如下:

          Private void ListenThread.Listen()

      {

            while(true)

        {

          if(串口有接收数据)

              {

                   DealRcvThread = new Thread(new ThreadStart(DealRcvFunc))

          }

        //Thread.Sleep(10);

        }

      }

      Private void DealRcvFunc()

      {

            if(此接收帧数据字节数+接收缓冲区已存的字节数 > ReceivedBytesThreshold)

        {

              触发第一次DataReceive事件;

        }

        Thread.Sleep(延时);

        If(接收缓冲区已存的字节数 > ReceivedBytesThreshold)

        {

               触发第二次DataReceive事件;

        }

        //Thread.Sleep(延时);

        线程退出;

      }

      两个Thread.Sleep(延时)过程可能在某个while循环内。

  • 相关阅读:
    Httpclient请求数据(post)
    实现定位(无基本地图)
    Httpclient请求数据
    带参数路径的刷新和加载
    AsyncTask异步交互和httpurlconnection结合使用
    判断网络状态
    Android数字签名
    app加固
    定位和xml解析和gson解析加上拉加载,下拉刷新
    下载app后自动安装程序
  • 原文地址:https://www.cnblogs.com/fyhui/p/2486870.html
Copyright © 2020-2023  润新知