从用户空间设置终端的波特率有什么含义?

she*_*lbc 3 usb devices stty uart

有时我只需要从串行设备读取,所以我跳过了minicomorscreen和 just的复杂性cat。但是,这仅在我stty <baud>尝试打开文件之前首先设置终端的波特率时才有效。

该数据可能已经(或可以)缓存在内核中,在这种情况下,是使用UART 到 USB 桥接器接收的。USB 传输速率对于给定标准是固定的,因此设置波特率只会影响数据的解释。鉴于我对这些数据在 USB 数据包中的外观缺乏了解,我不确定如何以某个固定读取速率(波特率)可视化 USB 数据包数据的“解释”。

$ stty 115200
$ cat /dev/ttyACM0
Run Code Online (Sandbox Code Playgroud)

这里到底发生了什么?我了解此设置在硬件中的含义,但它在用户空间软件中意味着什么?

Aus*_*arn 7

看起来您可能对这一切如何运作感到有些困惑。

首先,/dev/ttyACM0不代表 USB 链接,甚至不代表您连接的任何串行适配器的 USB 端点,它代表处理串行通信的适配器内部的 UART。您从中读取的数据不包含任何 USB 标头或帧,就像您读取的数据/dev/ttyS0不包含任何 PCI Express 标头或帧一样。在这些上设置波特率会影响它所代表的硬件,而不是它所连接的总线,因此这不会对 USB 连接产生任何影响。

其次,波特率是硬件设置,而不是软件设置。当您调用stty在串行端口上设置它时,这就是告诉内核告诉硬件更改它尝试接收数据的波特率。这特别意味着在此更改之前收到的任何数据要么是伪造的(因为硬件未正确解释它,有时是波特率彼此接近或精确谐波的情况),要么完全丢失(因为硬件不接受它,现代硬件更有可能出现这种情况)。

如果您计划从串行线路读取数据,则需要在另一端传输任何数据之前正确设置波特率。这也意味着改变波特率不会改变内核解释数据的方式。如果数据已经缓冲在内核中,那么它不会仅仅因为您更改波特率而更改(尽管在更改波特率以耗尽内核缓冲区之后这是一个很好的做法,以便您知道任何未来的数据都是好的)。

因此,澄清一下,在不使用特殊软件的情况下从 USB 转串口适配器中获取数据的正确方法是:

  1. 设置系统启动时的波特率。对于 USB 到串行适配器,这可能应该是 udev 规则,以便在设备插入时也设置它。
  2. 使用cat(或者od如果您需要字节值而不是文本)来读取数据。这将返回 USB 到串行适配器接收的确切数据(假设适配器不进行特殊处理)。