日期:2014-05-17  浏览次数:20797 次

C# 串口编程,接收到的数据不完整!!!!!虔诚求教!
接收数据的事件如下:
 void commPlc_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            byte[] buffer=new byte[commPlc.BytesToRead];
            commPlc.Read(buffer, 0, commPlc.BytesToRead);
            instr = "";
            foreach (byte b in buffer)
            {
                instr += b.ToString("X2");
            }
主程序中:
outbuf = new byte[6] { 0x10, 0x02, 0x00, 0x5C, 0x5E, 0x16 };
                commPlc.Write(outbuf, 0, outbuf.Length);
                System.Threading.Thread.Sleep(600);

                if (instr == "681212680002083203000000000002000100000501FF4716")
                {
                  ………………………………
                 }


instr接收到的应该是“681212680002083203000000000002000100000501FF4716”,但是现在却是“0100000501FF4716”。怎么回事呢?

如果我在System.Threading.Thread.Sleep(600); 这一行加断点,单步执行的话,接收到的数据就完整了。


求各位高手支招!!!!!不胜感激!!

------解决方案--------------------
数据会分段发过来,自己做拼包
------解决方案--------------------
没有问题呀,我用的就是串口发收的。
------解决方案--------------------
System.Threading.Thread.Sleep(600); 
为什么要加这个?

你发送数据到串口以后,串口就给你发送数据了。
这个时候,你却使用Sleep阻塞当前线程的活动,
线程不能接收串口发来的数据,当然会丢失了。
去掉这句话,如果对你的程序造成了其他的影响,要想别的办法,这个会阻塞线程,丢失数据。
------解决方案--------------------
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

------解决方案--------------------
读取接收缓冲区前,加一个延时,延时50毫秒或者100毫秒,就ok了。
原因是串口比较慢,在还没有数据全部放入缓冲区,就被拿走了,所以不全。
------解决方案--------------------