System.Threading.Thread.Sleep(600); 
为什么要加这个?你发送数据到串口以后,串口就给你发送数据了。
这个时候,你却使用Sleep阻塞当前线程的活动,
线程不能接收串口发来的数据,当然会丢失了。
去掉这句话,如果对你的程序造成了其他的影响,要想别的办法,这个会阻塞线程,丢失数据。

解决方案 »

  1.   

    4楼显然看错楼主的意思了,楼主是加了System.Threading.Thread.Sleep(600);  才可以接收完整的数据,否则数据不完整MSDN上的资料显示:在执行事件处理程序之间会稍微延迟。 一次只能执行一个事件处理程序。不保证对接收到的每个字节引发 DataReceived 事件。楼主你用断点调试会发现,实际上你的DataReceived事件共触发了三次,但你每次触发的时候  
    instr = "";导致原先的instr清空
    解决办法有两种,
    一个是在DataReceived事件里加入
    System.Threading.Thread.Sleep(600); 
    byte[] buffer=new byte[commPlc.BytesToRead];
    这样可以等待缓冲区的数据缓冲好,一次接收数据,也就是只触发一次DataReceived事件方法二:
    将instr定义成全局变量,删除事件里的instr="";这样可以保证每次触发的时候不会清空instr
      

  2.   

    延时不一定要600ms,这个太长,100ms的样子差不多了,看你的波特率了,如果是9600的波特率,100ms可以缓冲大约100字节的东西,基本可以满足了。
    System.Threading.Thread.Sleep(100); 
    这个延时还是放在DataReceived里比较好,在接收缓冲区的数据之前
      

  3.   

     麻烦看清楚thread.Sleep(600)阻塞的是哪个线程。楼主调用线程休眠是主线程的,而微软封装串行口的接收数据事件是另外开了一个异步线程来做的处理。