我有 2 个以上的串行设备被 FTDI 驱动程序枚举为、/dev/ttyUSB0
等。重新启动时,这些设备可能会以任何其他顺序混乱。另外,我可能会在这些设备之间或与其他类似设备进行物理替换/交换。/dev/ttyUSB1
/dev/ttyUSB2
现在,我想要对这些进行持久枚举。我希望根据设备连接到的物理 USB 端口(我可以直接连接到 PC 主板上的 USB 端口或使用 USB 集线器)来枚举设备名称 - 比如说设备是否连接到USB 集线器,端口 1 应保留为ttyUSB0
,端口 2 为 ,ttyUSB1
依此类推。
经过一些基本的阅读后,我想(如前所述这里)/dev/serial/by-path/
以符号链接的形式列出设备。因此,我创建了一个/etc/udev/rules.d/101-usb-serial.rules
包含以下内容的文件:
KERNEL=="ttyUSB[0-9]*", SUBSYSTEM=="tty", DRIVERS=="ftdi_sio", PATH=="pci-0000:00:14.0-usb-0:10.1:1.0", SYMLINK+="ttyUSB000"
KERNEL=="ttyUSB[0-9]*", SUBSYSTEM=="tty", DRIVERS=="ftdi_sio", PATH=="pci-0000:00:14.0-usb-0:10.2:1.0", SYMLINK+="ttyUSB001"
KERNEL=="ttyUSB[0-9]*", SUBSYSTEM=="tty", DRIVERS=="ftdi_sio", PATH=="pci-0000:00:14.0-usb-0:10.3:1.0", SYMLINK+="ttyUSB002"
但这行不通。执行此操作时,ls /dev/ttyUSB*
我无法看到我创建的新符号链接。可能出了什么问题?
答案1
从上面的评论中得到线索,我设法找到了上述问题的解决方案。
udevadm info /dev/ttyUSB0 | grep "ID_PATH="
/dev/ttyUSB0
上面列出了所连接端口的 sysfs 路径。使用此值在规则文件中为任意数量的设备( ttyUSB1
, ....)创建规则,如下所示:ttyUSB2
/etc/udev/rules.d/101-usb-serial.rules
SUBSYSTEM=="tty",ENV{ID_PATH}=="pci-0000:00:14.0-usb-0:10.1:1.0",SYMLINK+="ttyUSB001"
SUBSYSTEM=="tty",ENV{ID_PATH}=="pci-0000:00:14.0-usb-0:10.2:1.0",SYMLINK+="ttyUSB002"
SUBSYSTEM=="tty",ENV{ID_PATH}=="pci-0000:00:14.0-usb-0:10.3:1.0",SYMLINK+="ttyUSB003"
完成更改或创建文件后,运行以下命令:
sudo udevadm control --reload-rules
sudo /etc/init.d/udev restart
聚苯乙烯:上面的示例场景(我正在使用的场景)使用的是 4 端口贝尔金 USB 集线器。Device 1
连接到port 1
集线器Device 2
连接到port 2
等等。