she*_*lbc 3 usb devices stty uart
有时我只需要从串行设备读取,所以我跳过了minicom
orscreen
和 just的复杂性cat
。但是,这仅在我stty <baud>
尝试打开文件之前首先设置终端的波特率时才有效。
该数据可能已经(或可以)缓存在内核中,在这种情况下,是使用UART 到 USB 桥接器接收的。USB 传输速率对于给定标准是固定的,因此设置波特率只会影响数据的解释。鉴于我对这些数据在 USB 数据包中的外观缺乏了解,我不确定如何以某个固定读取速率(波特率)可视化 USB 数据包数据的“解释”。
$ stty 115200
$ cat /dev/ttyACM0
Run Code Online (Sandbox Code Playgroud)
这里到底发生了什么?我了解此设置在硬件中的含义,但它在用户空间软件中意味着什么?
看起来您可能对这一切如何运作感到有些困惑。
首先,/dev/ttyACM0
不代表 USB 链接,甚至不代表您连接的任何串行适配器的 USB 端点,它代表处理串行通信的适配器内部的 UART。您从中读取的数据不包含任何 USB 标头或帧,就像您读取的数据/dev/ttyS0
不包含任何 PCI Express 标头或帧一样。在这些上设置波特率会影响它所代表的硬件,而不是它所连接的总线,因此这不会对 USB 连接产生任何影响。
其次,波特率是硬件设置,而不是软件设置。当您调用stty
在串行端口上设置它时,这就是告诉内核告诉硬件更改它尝试接收数据的波特率。这特别意味着在此更改之前收到的任何数据要么是伪造的(因为硬件未正确解释它,有时是波特率彼此接近或精确谐波的情况),要么完全丢失(因为硬件不接受它,现代硬件更有可能出现这种情况)。
如果您计划从串行线路读取数据,则需要在另一端传输任何数据之前正确设置波特率。这也意味着改变波特率不会改变内核解释数据的方式。如果数据已经缓冲在内核中,那么它不会仅仅因为您更改波特率而更改(尽管在更改波特率以耗尽内核缓冲区之后这是一个很好的做法,以便您知道任何未来的数据都是好的)。
因此,澄清一下,在不使用特殊软件的情况下从 USB 转串口适配器中获取数据的正确方法是:
cat
(或者od
如果您需要字节值而不是文本)来读取数据。这将返回 USB 到串行适配器接收的确切数据(假设适配器不进行特殊处理)。 归档时间: |
|
查看次数: |
1241 次 |
最近记录: |