SerialPort通信问题

时间:2011-01-19 16:12:32

标签: c# .net serial-port

我知道.NET中的SerialPort通信旨在在数据可用并到达阈值时将DataReceived事件发送给接收方。

我们是否可以不使用DataReceived事件并在接收方启动线程来频繁调用其中一个ReadXXX方法来获取数据?

如果收件人比发件人慢得多会怎么样? SerialPort缓冲区会溢出(数据丢失)?

3 个答案:

答案 0 :(得分:1)

这样做是没有意义的,只需在打开端口后自己启动阅读器线程,而不要打扰DataReceived。在启动线程后,特别是在收到数据的时候,按照自己的方式进行操作很困难,很难干净地取消订阅DataReceived事件。你买不起两者。

答案 1 :(得分:0)

这是有效的,事实上这是我在问题Constantly reading from a serial port with a background thread中使用的方式之一。

对于您的场景,您可以收听DataReceived event,然后启动一个在端口上调用ReadExisting的线程以获取所有当前可用的字节。您还可以通过查看SerialPort.BytesToRead属性来检查接收缓冲区中等待的字节数。

至于你的接收缓冲区溢出,a)它足够大(你可以检查SerialPort.ReadBufferSize属性)和b)这不是1982,所以CPU足够快以处理来自端口的数据,以便它没有时间填满(当然比串行数据速率快得多)。

答案 2 :(得分:0)

读取串口的线程的功能如下:

        private void ThreadRx()
        {
                while (true)
                {
                    try
                    {
                        if (this._serialPort.IsOpen == true)
                        {
                            int count = this._serialPort.BytesToRead;
                            if (count > 0)
                            {
                                byte[] Buffer = new Byte[count];
                                this._serialPort.Read(Buffer, 0, count);

                            //To do: Call your reception event (sending the buffer)
                            }
                            else
                            {
                                Thread.Sleep(50);
                            }
                        }
                        else
                        {
                            Thread.Sleep(200);
                        }
                    }
                    catch (ThreadAbortException ex)
                    {
                        //this exception is invoked calling the Abort method of the thread to finish the thread
                        break;//exit from while
                    }
                    catch (Exception ex)
                    {
                        //To do:call your error event
                    }
                }
        }

不要担心输入缓冲区,因为线程读取速度比串口通信的波特率快得多,你甚至可以用同样的代码来读取tcp / ip socket。