zoukankan      html  css  js  c++  java
  • 串口通信之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循环内。

  • 相关阅读:
    力扣
    linux网卡知识
    opencv C++ Mat构造函数
    C++ vector迭代器访问二维数组
    opencv Scalar
    C++智能指针
    c++结构体
    C++ 公有继承、保护继承和私有继承的对比
    乌班图设置C++11
    C++类模板的使用
  • 原文地址:https://www.cnblogs.com/fyhui/p/2486870.html
Copyright © 2011-2022 走看看