我使用多个 Linux 服务器主机,其中插入了多个串行到 USB 链路。它们看起来像 /dev/ttyUSBx 设备,其中 x 是从 0 开始的数字。客户端设备经常重新启动或脱机或被拔出或添加了新的。这会导致 ttyUSB 设备编号不断变化,因为每个新客户端都会占用最低的未使用编号。
我可以以某种方式将客户端设备设置为具有恒定数量吗?例如,客户端 A 将是 ttyUSB0,然后客户端 B 将是 ttyUSB1,依此类推。当客户端 A 离线且客户端 B 重新启动时,它将作为 ttyUSB1 重新上线,并且不会有 ttyUSB0(因为它已离线)。
PS:主机要么是Debian,要么是Ubuntu,以Debian为主。
答案1
在这种情况下,有 2 个解决方案可以提供帮助:
- 编辑 udev 规则为您的设备创建符号链接,例如 /dev/ttyClientA 和 /dev/ttyClientB,然后您无需再担心 ttyUSB 后面的后缀号:
检查系统中安装的设备:
# lsusb Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub Bus 001 Device 006: ID 04d8:0205 Microchip Technology, Inc. innodisk USB Dual CAN Bus 001 Device 005: ID 1a86:7523 QinHeng Electronics HL-340 USB-Serial adapter Bus 001 Device 004: ID 0483:5740 STMicroelectronics Virtual COM Port Bus 001 Device 002: ID 0403:6001 Future Technology Devices International, Ltd FT232 Serial (UART) IC Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
获取供应商 ID、产品 ID 和序列号。使用 lsusb 时确保它们与您想要的相匹配。例如我想使用ttyUSB1
# TTYDEVICE="ttyUSB1" ; sudo echo -e "$(udevadm info -a -n /dev/${TTYDEVICE} | grep ATTRS{idVendor}) \n$(udevadm info -a -n /dev/${TTYDEVICE} | grep ATTRS{idProduct}) \n$(udevadm info -a -n /dev/${TTYDEVICE} | grep ATTRS{serial}) \n" ATTRS{idVendor}=="1a86" ATTRS{idVendor}=="1d6b" ATTRS{idProduct}=="7523" ATTRS{idProduct}=="0002" ATTRS{serial}=="0000:00:14.0"
1d6b:0002是系统中的USB集线器ic,我们不用,我们使用属性来制定udev规则。将以下行添加到文件 /etc/udev/rules.d/99-usb-serial.rules:
SUBSYSTEM=="tty", ATTRS{idVendor}=="1a86", ATTRS{idProduct}=="7523", ATTRS{serial}=="0000:00:14.0", SYMLINK+="ttyClientA"
重新加载 udev,执行此步骤后,您的设备应该是 /dev/ttyClientA:
# sudo udevadm control --reload-rules && sudo udevadm trigger
- 如果选项 1 不起作用,可以采用此解决方案。使用选项 1 中的命令扫描所有 ttyUSBx 设备,以获取供应商 ID、产品 ID 和序列号,并检查它们是否与您想要的匹配,然后在应用程序中使用该设备。
答案2
这可能是不可能的。但是当设备出现时,您可以让 udev 为您创建符号链接。/dev/ttyUSB0
除了例如,您不会再连接到任何其他设备/dev/ttyUSB-A
。
答案3
要查看可用串行设备的列表,请检查 的内容/dev/serial/by-id/
。例如,在我的系统中,有一个符号链接/dev/serial/by-id/usb-FTDI_FT230X_Basic_UART_D307YFO0-if00-port0
指向/dev/ttyUSB0
.