System.Threading.Thread.Sleep(600);
为什么要加这个?你发送数据到串口以后,串口就给你发送数据了。
这个时候,你却使用Sleep阻塞当前线程的活动,
线程不能接收串口发来的数据,当然会丢失了。
去掉这句话,如果对你的程序造成了其他的影响,要想别的办法,这个会阻塞线程,丢失数据。
为什么要加这个?你发送数据到串口以后,串口就给你发送数据了。
这个时候,你却使用Sleep阻塞当前线程的活动,
线程不能接收串口发来的数据,当然会丢失了。
去掉这句话,如果对你的程序造成了其他的影响,要想别的办法,这个会阻塞线程,丢失数据。
instr = "";导致原先的instr清空
解决办法有两种,
一个是在DataReceived事件里加入
System.Threading.Thread.Sleep(600);
byte[] buffer=new byte[commPlc.BytesToRead];
这样可以等待缓冲区的数据缓冲好,一次接收数据,也就是只触发一次DataReceived事件方法二:
将instr定义成全局变量,删除事件里的instr="";这样可以保证每次触发的时候不会清空instr
System.Threading.Thread.Sleep(100);
这个延时还是放在DataReceived里比较好,在接收缓冲区的数据之前