Linux 中的 USB 串行端口意外更改

Serial port over USB in Linux changes unexpectedly

我在使用 USB 接口上的 RS232 与工作站通信时遇到问题。 一旦设备连接,它就会收到地址 /dev/ttyUSB0,在发送接收命令的一些(随机)时间后,设备似乎挂起。 通过查看设备事件(dmesg),我们发现了以下错误:

ftdi_sio ttyUSB0: failed to get modem status: -32
...
USB disconnect, device number 29
[66208.321174] ftdi_sio ttyUSB0: FTDI USB Serial Device converter now disconnected from ttyUSB0
[66208.497613] usb 1-1.5: new full-speed USB device number 30 using ehci-pci
[66208.589052] usb 1-1.5: New USB device found, idVendor=0403, idProduct=6001
[66208.589055] usb 1-1.5: New USB device strings: Mfr=1, Product=2, SerialNumber=3

显然系统注意到一个设备disconnection/reconnection,因此,该设备被挂载到另一个端口,即/dev/ttyUSB1,导致进一步的通信失败。 创建一个测试平台会改变行为:错误出现的频率似乎较低,而使用完整的应用程序时错误会反复出现。 应用程序使用 jSSC-2.8.0 与串口通信。整个应用是用java8编写的,使用Restle库向一些web服务发出一些REST请求。 是什么导致了这些奇怪的行为?

已添加 根据下面的@DarkFalcon 评论,测试平台轮询设备的速度通常比真实应用程序快:这可能可以解释为什么测试比另一个更好。

此错误是由于管道损坏而由驱动程序打印的。请参阅驱动程序文件 drivers/usb/serial/ftdi_sio.c 中的 ftdi_get_modem_status()

您可以尝试其他库,如 'serial communication manager'、purejavacom 等。看看问题是否仍然存在。我觉得,首先要确定谁在制造问题;您的应用程序、串行库或驱动程序。然后相应地前进。驱动程序已经过测试,可能库或应用程序可能有一些我们需要纠正的东西。

问题出在电源管理上:盒子决定设备处于空闲状态,并在一定时间后断开电源。然后该设备显然在几乎 0 时间内再次活跃起来。所以奇怪的行为