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

  • 相关阅读:
    读財报:交易额增长111%的京东,为毛还是亏?
    HDU 1548 A strange lift 搜索
    linux两台server远程copy文件
    Nginx 反向代理、负载均衡、页面缓存、URL重写及读写分离具体解释
    js事件防止冒泡
    LeetCode Rotate Array
    ARM架构授权和IP核授权有什么不一样啊?
    Linux系统结构 详解
    mount -o
    ARM开发板系统移植-----u-boot的编译
  • 原文地址:https://www.cnblogs.com/fyhui/p/2486870.html
Copyright © 2020-2023  润新知