簡體   English   中英

RS-485串行端口波特率性能效率

[英]RS-485 Serial Port Baud Rate Performance Efficiency

我正在用Python開發一個應用程序,該應用程序通過RS-485兩線半雙工與設備通信。 我有足夠的應用程序工作,可以執行一些性能測試。 我正在使用帶USB到485轉換器的筆記本電腦。 通訊設置為9600,N,8,1。

為了進行速度測試,我發送了一條消息,該消息的總長度為10個字節,其中包括校驗字節。 然后,我等待13個字節的答復。 我對收到的答復進行解碼。響應完成后。 然后,我發送下一條消息。 我會盡快重復此操作100次。 這需要2.895秒。

據此,我計算出我正在發送/接收23個字節* 100次迭代/ 2.895秒= 79​​4個字節/秒。

如果我理解正確,9600 N-8-1的串行端口通信具有1個起始位,8個數據位和1個停止位。 這意味着它有2位的開銷。 因此,實際的理論傳輸速率為(9600位/ s)*(8個數據位/ 10個傳輸位)*(1字節/ 8位)= 960字節/ s。

我的程序正在以794字節/秒的組合速率發送/接收,可能是960字節/秒= 82.7%。

我是否應該能夠達到960字節/秒的接近100%的速度。 還是有這么多帶寬未被利用是典型的?

當通信方向相反時,您將放棄一些時間。 因此,當一側接收到最后一個停止位與將第一個響應字節加載到UART發送器並開始驅動第一個起始位之間有一段“死時間”。

我計算得出,每次雙向運行的停滯時間為5毫秒(幾乎5比特時間,即計算幀開銷的半個字節),即2.895總秒數的0.495秒。 這還不錯,但可能會更好。 但是,我不確定如果不編寫自己的UART驅動程序,您是否會得到很大的改進。

(當然,所有這些都假設兩台計算機使用的時鍾都非常精確。這並不總是正確的,因為在8N1的UART可以容忍兩端之間大約2%的時鍾差。)

在嵌入式領域,如果我們想在絕對最小的帶寬損耗下做到這一點,我們會將驅動程序編寫為標准的雙向全雙工驅動程序,並通過某種方式知道何時切換方向(例如,在數據包邊界上)。 然后,該驅動程序將僅按正確方向推送字節,而其他隊列未使用。

在用戶(應用程序)級別,我們必須確保這些隊列永遠不會餓死。 這意味着,在您的示例中,在完全接收10字節的傳入數據包之前 ,需要准備好13字節的響應數據包。 另一端也需要這樣做。

對於大型機器,通常的做法是在每個方向上“突顯”多個數據包並連續傳輸,以最大程度地減少更改方向的次數。 但是,這會增加延遲,並且需要更多的內存,這對於只有幾KB RAM的小型微控制器可能是個問題。

恕我直言,考慮到您的小數據包,頻繁的方向反轉以及缺乏驅動程序級別的優化,帶寬看起來是正確的。

暫無
暫無

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

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