串口通信之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循环内。

原文地址:https://www.cnblogs.com/fyhui/p/2486870.html