我目前正在设计一个系统,该系统需要从串行设备(主要是 ARM 板)接收数据。为此,我使用了一些 USB 转串行 (FTDI232) 适配器。我编写了一个简单的环回程序(9600 波特)来测试设置,刷新了 ARM 板,并成功接收了我发送的所有内容,没有任何数据丢失。
但是,该系统最终需要与许多电路板进行通信。因此,我将一个 USB 集线器连接到 USB 端口,并用它来连接更多电路板。但是,几天后我们注意到了一些问题。首先,似乎出现了一些位翻转。然后我们发现,当我们从电路板接收消息时,甚至整个字节都会丢失。当我们将这些适配器连接到普通 USB 端口(中间没有集线器)时,问题就消失了。
我们假设这是一个缓冲问题。也许串行控制器或设备发送数据的速度太快了。因此,我们在串行端安装了 RTS/CTS 流量控制。同样,字节被 USB 集线器丢弃,而不是当串行适配器直接连接到 PC 时。
我们把 USB 集线器换成了更贵的,但什么也没改变。我们换了电脑,但问题也没解决。此外,令人困惑的是,集线器不会丢弃我们发送到串行适配器的数据包,而只会丢弃串行适配器发送的数据包。
有人知道我该如何解决这个问题,或者问题是由什么引起的吗?我们认为是 USB 集线器导致了这个问题。但是,我们依赖它,因为我们必须连接许多设备。因此,在我们创建自己的串行处理解决方案(专用 FPGA 或基于 Pi)之前,我想问一下这里有没有人知道发生了什么?是否有 Linux 配置文件,可能允许更快的轮询(如果是轮询问题)?我认为串行适配器不是这里的问题。
答案1
为了实现这一点,我使用了一些 USB 转串行 (FTDI232) 适配器
使用 USB 2.0 HS 协议的更好适配器。FS 设备与 HS 集线器的一个问题是主机必须使用拆分事务协议,该协议因极其复杂而实施困难。我不敢打赌拆分事务引擎曾在大量糟糕的 FS UART 桥上进行过测试。
另一件事是,许多 USB 2.0 集线器只有一个 TT,因此整体性能很差,缓冲/调度必须非常小心。同样,疯狂的 CDC 轮询协议应该让一切变得不可能。获得更好的 USB-UART 桥接器,基于 FT232H 的东西。
直接主机连接和通过 USB 集线器连接的区别在于,在主机情况下,事务直接在本机 FS 协议中执行,而通过集线器连接则需要与拆分事务配合使用的特殊驱动程序。您可能有一个弱的拆分事务驱动程序。
答案2
混合使用 USB2 和 USB3 设备和接口时要谨慎。这种混合可能会引发一些问题。此外,请记住,有些 USB 集线器简直就是垃圾。