高速串行在 Linux 上出现乱码但在 Windows 上有效

High-Speed Serial garbled on Linux but works on Windows

在 Windows 上(本机或 运行 在来自 Linux 主机的虚拟机上),我可以在 8N1[=51 中打开串行端口=] 模式和我想要的速度 921600 bps,并且传入的测试字符串从外部硬件设备正常到达:HELLO WORLD.

在 Linux 上,但是,使用相同的串行配置我只能得到 轻微的 乱码文本:H�LLO �OR�D.

但是,较低的波特率(例如 460800 bps)在 Windows 和 Linux 中都可以正常工作。因此,通过使用 921600 bps,我显然达到了速度最大值,这是由 Linux.

的某些组件强加的

为什么会这样? Linux 对串口波特率有默认限制吗? 我应该配置什么来启用高于 460800 bps 的波特率吗?

更多细节:

  • 外接设备串口输出通过CH340G型串口转USB连接电脑

  • 测试的软件是 Windows 上的 TeraTerm 和 PuTTY,Linux 上的 picocom、minicom 和 screen。

  • 已测试 O.S。版本是 Windows 7、Ubuntu Linux 16.04 和 Ubuntu 20.04。

  • 如前所述(但值得重复),如果从 VirtualBox 虚拟机打开 Windows 运行 上的串口,可以正常读取文本,从相同的 Linux 主机无法处理所提到的波特率!我想这是可行的,因为 VirtualBox 只是进行 USB 设备直通,所以无论 Linux 有什么限制,它们都不适用于虚拟化 Windows.

  • 理论上,我的 Linux 似乎支持请求的速度:文件 /usr/include/asm-generic/termbits.h 包含 B921600 的定义(连同较低的定义,例如 B460800,以及许多其他更高的 B4000000)。

CH340 驱动程序 is/was 存在错误。

显然,921600 bps 的波特率误差超过7%。我想这就是您可能遇到的情况。

我没有任何这样的设备,所以我没有进一步研究这个问题,我不确定为解决这个问题而编写的一个或多个补丁是否最终出现在主线内核中。

你将不得不去 here 并找到你自己。