111,120
社区成员
发帖
与我相关
我的任务
分享
private void comm_DataReceived_1(object sender, SerialDataReceivedEventArgs e)
{
yanshi++;
if (yanshi < 10) return; //仪器的初始化
Data_Receive.Clear();
Thread.Sleep(100); //读取速度太慢,加Sleep延长读取时间, 不可缺少
byte[] buf = new byte[6]; //声明一个临时数组存储当前来的串口数据
received_count += 1; //增加接收计数
comm.Read(buf, 0, 6); //读取缓冲数据
comm.DiscardInBuffer(); //清空缓存,避免下次的数据相互干扰
}
好久没来了,看到这个楼主写的那个接收方法明显有问题,comm.DiscardInBuffer(); 特别是用上了这个。。。
串口发送过来的数据,有时还在缓存区,如果没达到一定的长度是不会触发DataRevive事件 此时你把他清空了,就造成你上面说的200个数据出错。那是因为它也像TCPIP通信一样,在接收的缓存区 粘包。串口数据接收到的数据,下位机有时发送6个字符过来。你的上位机在DataRecive时不一定就是6个字符,有可能是分成两次接收,先接收到4个字符,第二次是2个字符。 这是时有发生的,也就是发生了你上面的问题了,你做这个,应写一个接收字节缓冲区,专门接收字节,也不用Sleep()
看一下这个吧,http://blog.csdn.net/wyd1520/article/details/23822313
这个也是为论坛另一网友跟你提的一样的问题写的。
这是当时他提的原贴子
http://bbs.csdn.net/topics/390316188