串行传输波特率不匹配

串行传输波特率不匹配

我有两个串口,一个通过主板提供(/dev/ttyS0),一个从 PCIE 到 RS232 卡(Startech 2S952),带有牛津芯片(/dev/ttyS1)(有 /dev/ttyS2 但不进入这个故事) )。在我的情况下如何解释波特率?

[    1.111618] 00:03: ttyS0 at I/O 0x3f8 (irq = 4, base_baud = 115200) is a 16550A
[    1.112543] 0000:08:00.0: ttyS1 at I/O 0xf010 (irq = 40, base_baud = 4000000) is a 16550A

我将逻辑分析仪连接到串行端口的 Tx/Rx 线上。当我做:

stty -F /dev/ttyS0 115200
echo "ABCDEFGH" > /dev/ttyS0

然后我可以在逻辑分析仪上解码“ABCDEFGH”字符串,后跟 0x0D 0x0A,但我必须告诉它波特率是 115200。另外,当我使用 USB 串行适配器(通过空调制解调器电缆)连接笔记本电脑并读取关闭串行端口,只有当我将接收器设置为 115200 时,我才能得到有意义的输出。这是我所理解的。

现在使用 /dev/ttyS1:

stty -F /dev/ttyS1 115200
echo "ABCDEFGH" > /dev/ttyS1

我在逻辑分析中清楚地看到,我的消息以毫秒为单位要慢得多。事实上,它大约慢了 34.7(2) 倍,即 40000000/115200 = 34.7(2)。特别是,接收方笔记本电脑会收到一条包含多个 0x00 的消息。当我设置为 3200 波特时,它会看到乱码。显然,该消息实际上是以 115200/34.6 = 3339.13... bps 的速率传输的。

对于 /dev/ttyS1:

stty -F /dev/ttyS1 4000000
echo "ABCDEFGH" > /dev/ttyS1

与 /dev/ttyS1 的通信发生时,位持续时间与预期的 115200 相匹配。

那么对于我来说这意味着:

[    1.112543] 0000:08:00.0: ttyS1 at I/O 0xf010 (irq = 40, base_baud = 4000000) is a 16550A

应将“4000000”解释为某些内部振荡器的频率,导致现实世界中的传输为 115200。我希望这个值位于硬件内部并隐藏在驱动程序深处。

我缺少什么?这是我第一次使用串口,​​所以我完全迷失了。

如果我将“console=ttyS1,4000000n8”作为内核参数传递,那么我就可以在笔记本电脑上设置 115200 通过串行进行通信。

答案1

因此,根据猜测,似乎无论出于何种原因,内核对该卡上运行的基本时钟的理解是错误的。串行端口是简单的设备,如果系统没有标准方法从卡中找到它,我不会感到惊讶。至少在某些情况下,配置的部分是除数应用于基本时钟,并且获得它需要知道实际的基本时钟。

(该卡确实有用于设置最大速度的跳线,因此也许它有某种方式将设置告诉支持它的驱动程序。)

不管怎样,setserial看起来有一个baud_base选项,我猜使用它可能有助于手动解决问题:

setserial /dev/ttyS1 baud_base 115200

相关内容