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了。
原因是串口比较慢,在还没有数据全部放入缓冲区,就被拿走了,所以不全。
------解决方案--------------------延时不一定要600ms,这个太长,100ms的样子差不多了,看你的波特率了,如果是9600的波特率,100ms可以缓冲大约100字节的东西,基本可以满足了。
System.Threading.Thread.Sleep(100);
这个延时还是放在DataReceived里比较好,在接收缓冲区的数据之前