关于c#中的SerialPort通信

关于c#中的SerialPort通讯
用SerialPort写了一个串口通讯程序,发送正常,接收每次要208个字节,我将seriPort.ReceivedBytesThreshold = 208;发送过程中,我发现有事接受的字符不足208个,造成程序中断,于是我在mySerialPort_DataReceived里面加了一个while循环,必须达到208个字节时我才处理,这下好了一点,但是又出新问题,到最后他永远都不给我208字节的数据,程序进入死循环了。实际上它是有208个数据的,不知道这里为什么就会断掉,哪位有经验,帮帮忙!
private void mySerialPort_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
        {
            int n = seriPort.BytesToRead;
            while (n < seriPort.ReceivedBytesThreshold)
            {
                 n = seriPort.BytesToRead;
            }
            
            //if (n<seriPort.ReceivedBytesThreshold)
            //{
            //    System.Threading.Thread.Sleep(200); 
            //}
            byte[] buf = new byte[n];
            seriPort.Read(buf, 0, n);
            try
            {
                if (buf[2] == 4)
                {
                    nums = buf[30] * 256 + buf[29] * 16;
                }
            }
            catch (Exception)
            {
            }
           
            myUpdataHander = new HanderInterfaceUpdataDelegate(getData);
            txtGotoEndDelegate myGotoend = txtGotoEnd;
            HanderInterfaceUpdataDelegate myUpdata1 = new HanderInterfaceUpdataDelegate(txtReciveEvent);
            string abc, abc1;
            
                abc = ByteArrayToHexString(buf);
                string hexStringView = "";
                for (int i = 0; i < abc.Length; i += 2)
                {
                    hexStringView += abc.Substring(i, 2) + " ";
                }
                abc = hexStringView;
                abc1 = abc.Replace(" ", "");
                //if (abc1.Substring(abc1.Length - 2, 2) == "0D")
                //{
                //    abc = abc + "\n";
                //}
                Dispatcher.Invoke(myUpdataHander, new string[] { abc });
                Dispatcher.Invoke(myGotoend);
                Dispatcher.Invoke(myUpdata1, new string[] { n.ToString() });
        }

------解决思路----------------------
你没发现while循环写的有问题吗?
------解决思路----------------------
mySerialPort_DataReceived这个事件时当有数据发送过来时候就会触发,所以不应该用while处理,用if判断
------解决思路----------------------
引用:
Quote: 引用:

mySerialPort_DataReceived这个事件时当有数据发送过来时候就会触发,所以不应该用while处理,用if判断

我知道啊,但是他回来的字节数不够啊,所以我用while循环等待啊,直到够了才处理。但是他偶尔还有一直不够的造成死循环,我很费解啊!


你在这里边While循环,它下次就不触发这事件了。
你可以弄一个MemoryStream作为Buffer,把每次读取的内容写进去,满208字节就处理一下,然后把剩余的字节再作为新Buffer,这样循环,比较方便。
------解决思路----------------------
 

引用:
Quote: 引用:

mySerialPort_DataReceived这个事件时当有数据发送过来时候就会触发,所以不应该用while处理,用if判断

我知道啊,但是他回来的字节数不够啊,所以我用while循环等待啊,直到够了才处理。但是他偶尔还有一直不够的造成死循环,我很费解啊!

他是一次一次的返回数据,这个事件触发后指示接收了传递过来的数据,但是这个数据满足不满足要求,你可以用if判断,如果不满足要求,这次的接收事件处理完毕,下次数据传递过来时这个事件还会触发,然后你再判断新的数据
------解决思路----------------------
不能恢复。。。。