串口通信之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循環內。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM