最近用C# SerialPort类做单片机上位机程序,发现一个问题:
单片机一次发送一批数据(400字节左右)到上位机,上位机利用事件触发方式接收数据。
刚开始数据接收非常不稳定,上位机经常数据接收不完整。
后来我在事件处理函数最开始处加入了500ms延时,则每次数据接收就完全OK了。
不知道这是什么原因。感觉这样虽一时可以解决问题,但是感觉这样会影响接收的实时性。
是否还有更好的解决方法,让事件触发接收既实时,又能保证数据接收完整?
下面是我的事件处理程序演示代码:
void comm_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
Thread.Sleep(500);//这个延时非常重要
int n = sp.BytesToRead;//先记录下来,避免某种原因,人为的原因,操作几次之间时间长,缓存不一致
byte[] buf = new byte[n];//声明一个临时数组存储当前来的串口数据
sp.Read(buf, 0, n);//读取缓冲数据
//因为要访问ui资源,所以需要使用invoke方式同步ui。
this.Invoke((EventHandler)(delegate
{
for(int i;i<n;i++)
{
textBox1.text += buf[i].ToString();
}
}));
}