环境: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循环内。