環境: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循環內。