【问题标题】:High-Speed Serial garbled on Linux but works on Windows高速串行在 Linux 上出现乱码,但在 Windows 上工作
【发布时间】:2021-03-10 20:57:07
【问题描述】:

在 Windows(本机或在 Linux 主机的虚拟机上运行)上,我可以在 8N1 模式下打开一个串行端口,并且我希望的速度为 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。

  • 经过测试的操作系统版本是 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,以及许多其他较高的 @987654326 @)。

【问题讨论】:

  • 您似乎过度概括了一个案例。即使硬件相同,但操作系统和设备驱动程序不同,因此存在差异也就不足为奇了。此外,即使在包含文件中定义了通信速度值,也不是所有硬件和设备驱动程序都可以实现该性能。
  • 我提到了包含文件,因为从其他类似的问题来看,在那里找到所需的波特率似乎很重要。我很清楚硬件能够应对速度,所以我会排除它。这让我有了 SW 方面:要么是使用的具体应用程序(尝试了几个,所以我也会排除),或者是底层操作系统,因此我的问题。不过,我没想到问题可能出在特定的驱动程序上,而不是内核配置上。感谢您指出这一点,我将研究 CH340G 设备的驱动程序是否存在未解决的问题。
  • 我也有类似的问题,在 Windows 中也是如此。 CH340B(内置振荡器),在回送字符时丢失字符(RxD 连接到 TxD),速度高于 750000 波特。但 CH340G 与外部晶体没有问题。 CH340G 在 1.5 MBauds 下工作正常。由于 RxD 连接到 TxD,它不应该是波特率问题 Rx 和 Tx 使用相同的振荡器,但看起来确实如此。如果我发送 256 个字符,在大多数情况下会收到错误,但有时会出现低谷。使用 CH340G 类型和 12MHz 外部晶振在 1500000 波特下没有问题。部分 CH340
  • 感谢您分享您的意见。绝对似乎是片状硬件的问题,但在软件方面,驱动程序似乎也有很大的不同。我刚刚接受了另一个答案,因为在这段时间之后,我很确定这就是正在发生的事情。但您对不同版本 CH340 的实验也很有启发性和帮助。

标签: linux serial-port


【解决方案1】:

CH340 驱动程序存在/曾经存在错误。

显然,921600 bps 的波特率误差超过 7%。我猜你可能会遇到这种情况。

我没有任何此类设备,因此我没有对此进行进一步研究,并且我不确定为解决此问题而编写的一个或多个补丁是否最终出现在主线内核上。

您必须前往here 并找出自己。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-09
    • 2012-11-07
    • 1970-01-01
    • 1970-01-01
    • 2022-01-23
    相关资源
    最近更新 更多