從使用者空間設置終端的波特率有什麼影響?
有時我只需要從串列設備讀取,所以我跳過了
minicom
orscreen
和 just的複雜性cat
。stty <baud>
但是,這僅在我在嘗試打開文件之前首先設置終端的波特率時才有效。該數據可能已經(或可以)緩沖在核心中,並且在這種情況下,是使用UART 到 USB 橋接器接收的。USB 傳輸速率對於給定標準是固定的,因此設置波特率只會影響數據的解釋。由於我對這些數據在 USB 數據包中的外觀缺乏洞察力,我不確定如何以某個固定讀取速率(波特率)視覺化 USB 數據包數據的“解釋”。
$ stty 115200 $ cat /dev/ttyACM0
這裡到底發生了什麼?我了解此設置在硬體中的含義,但在使用者空間軟體中意味著什麼?
看起來你可能對這一切是如何運作的有點困惑。
首先,
/dev/ttyACM0
它不代表 USB 連結,甚至不代表您連接的任何串列適配器的 USB 端點,它代表處理串列通信的適配器內部的 UART。您從中讀取的數據將不包括任何 USB 標頭或幀,就像您從中讀取的數據/dev/ttyS0
將不包括任何 PCI Express 標頭或幀一樣。在這些上設置波特率會影響它所代表的硬體,而不是它所連接的匯流排,因此這不會對 USB 連接做任何事情。其次,波特率是硬體設置,而不是軟體設置。當您呼叫
stty
在串列埠上設置它時,這就是告訴核心告訴硬體改變它試圖接收數據的波特率。這尤其意味著在此更改之前接收到的任何數據都將是偽造的(因為硬體沒有正確解釋它,有時波特率彼此接近或精確諧波的情況),或者完全失去(因為硬體只是不接受它,現代硬體更有可能發生這種情況)。如果您計劃從串列線路讀取數據,則需要在另一端傳輸任何數據之前正確設置波特率。這也意味著改變波特率不會改變核心解釋數據的方式。如果數據已經在核心中緩衝,那麼它不會因為您更改波特率而改變(儘管在更改波特率以耗盡核心緩衝區之後這是一個很好的做法,以便您知道任何未來的數據都是好的)。
因此,澄清一下,在不使用特殊軟體的情況下從 USB 轉串口適配器獲取數據的正確方法是:
- 設置系統啟動時的波特率。對於 USB 到串列適配器,這可能應該是一個 udev 規則,以便在設備也插入時設置它。
- 使用
cat
(或者od
如果您需要字節值而不是文本)來讀取數據。這將返回 USB 到串列適配器接收到的確切數據(假設適配器不進行特殊處理)。