如何将 /dev/ttyUSB 设备设置为特定的常量设备号?

如何将 /dev/ttyUSB 设备设置为特定的常量设备号?

我使用多个 Linux 服务器主机,其中插入了多个串行到 USB 链路。它们看起来像 /dev/ttyUSBx 设备,其中 x 是从 0 开始的数字。客户端设备经常重新启动或脱机或被拔出或添加了新的。这会导致 ttyUSB 设备编号不断变化,因为每个新客户端都会占用最低的未使用编号。

我可以以某种方式将客户端设备设置为具有恒定数量吗?例如,客户端 A 将是 ttyUSB0,然后客户端 B 将是 ttyUSB1,依此类推。当客户端 A 离线且客户端 B 重新启动时,它将作为 ttyUSB1 重新上线,并且不会有 ttyUSB0(因为它已离线)。

PS:主机要么是Debian,要么是Ubuntu,以Debian为主。

答案1

在这种情况下,有 2 个解决方案可以提供帮助:

  1. 编辑 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 不起作用,可以采用此解决方案。使用选项 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.

相关内容