簡體   English   中英

SerialPort通訊問題

[英]SerialPort communication questions

我知道.NET中的SerialPort通信被設計為在數據可用並達到閾值時將DataReceived事件發送到接收器。

我們是否可以不使用該DataReceived事件並在接收器端啟動線程來頻繁調用那些ReadXXX方法之一來獲取數據?

如果接收器比發送器慢得多會發生什么? SerialPort緩沖區會溢出(數據丟失)嗎?

這樣做沒有什么意義,只要在打開端口后自己啟動讀取器線程即可,而不必理會DataReceived。 以這種方式進行操作非常困難,很難在啟動線程后徹底取消訂閱DataReceived事件,尤其是在接收數據的那一刻。 您不能同時擁有它們。

那行得通,事實上,這是我在問題中使用的方法之一, 不斷從具有后台線程的串行端口讀取數據

對於您的方案,您可以偵聽DataReceived event ,然后啟動一個線程,該線程在端口上調用ReadExisting以獲取所有當前可用的字節。 您還可以通過查看SerialPort.BytesToRead屬性來檢查接收緩沖區中正在等待多少字節。

至於接收緩沖區溢出,a)足夠大(您可以使用SerialPort.ReadBufferSize屬性檢查),b)這不是1982年,因此CPU足夠快地處理來自端口的數據,因此沒有填充時間(肯定比串行數據速率快得多)。

讀取串口的線程的功能可以是這樣的:

        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套接字。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM