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

求串口通讯达人解答,遇到了一个很蹊跷的问题
先上代码

 private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
 {//串口的波特率为9600
            List<byte> received=new List<byte>() ;
            int loopCount=0;//检测共分几次读取串口
            while (serialPort1.BytesToRead > 0)
            {
                loopCount++;
                int len = serialPort1.BytesToRead;
                byte[] temp = new byte[len];
                serialPort1.Read(temp, 0, len);
                received.AddRange(temp);
                Thread.Sleep(10);//延迟10ms,等待串口的数据缓冲好
            }
//其余处理代码
 }

问题是:经过调试发现,同样的波特率,但是却发现接收的不稳定,
        第一组数据从下位机发送了21个字节过来,有时是1次就读取了(通过查看loopCount的值发现),       有时是2次读取串口。当1次性读取串口时,第一次serialPort1.BytesToRead=21;分为两次读取时,第一次serialPort1.BytesToRead=16,第二次循环时,serialPort1.BytesToRead=5,很奇怪这是为什么呢

还有种情况是:第一次读取了16个字节,在Thread.Sleep(10)后,serialPort1.BytesToRead=0,于是数据就接收不完整了,此时就会跳出while (serialPort1.BytesToRead > 0)循环,我很奇怪呀,这10ms的时间里,用示波器可以看到下位机是有数据传送过来的,为什么这些数据没有进入serialPort1的缓冲区呢?
一样的代码,一样的波特率,为什么有时候进入触发事件时,缓冲区读到的字节数是16,有时候会超过16?为什么有时候Thread.Sleep(10);剩下的数据会存入缓冲区,有时候却不会?

不知道描述清楚了没,求达人解答呀
------解决方案--------------------
这应该是系统进程调度产生的结果,一个进程不是时时刻刻都在运行的,而每次运行的时间间隔也不一定相等,所以会导致每次读到数据量不等的情况

纯属个人意见 仅供参考
------解决方案--------------------
串口编程时有任何的延时行为都有可能导至接收丢数据。

因此我的策略是使用异步或者开一个线程去读数据(这就确保了不会有延时)。读到数据后再使异步调用处理函数(这样就可以无视处理时间了)。自从使用了这个方案后从来没有发生过丢数据的情况(受干扰除外)。

附代码


serialPort = new System.IO.Ports.SerialPort();
serialPort.DataReceived += new System.IO.Ports.SerialDataReceivedEventHandler(serialPort_DataReceived);
..........
serialPort.Open();




        void serialPort_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
        {
            System.Threading.Thread.CurrentThread.Priority = System.Threading.ThreadPriority.AboveNormal;//调高优先级,保证线程不会被其它线程阻塞。
            if (e.EventType == System.IO.Ports.SerialData.Chars)
            {
                while (serialPort.BytesToRead