26

我有两个基于相同 USB-RS232 芯片的不同 USB 设备。当我将它们插入 USB 时,它们会安装到 /dev/ttyUSB0...3

我的问题是,如何在脚本中找出哪个 tty 上是哪一个?

使用 lsusb 我可以区分它们:

$> lsusb | grep 0403:f850
Bus 004 Device 002: ID 0403:f850 Future Technology Devices International, Ltd
$> lsusb | grep 0403:6001
Bus 004 Device 003: ID 0403:6001 Future Technology Devices International, Ltd FT232 USB-Serial (UART) IC

并且使用 dmesg 我可以知道它们的安装位置:

$> dmesg | grep 'FTDI USB Serial Device converter now attached'
[36051.393350] usb 4-2: FTDI USB Serial Device converter now attached to ttyUSB1
[36061.823513] usb 4-1: FTDI USB Serial Device converter now attached to ttyUSB0

但“usb 4-1”似乎与“Bus 004 Device 002”不对应。

我可以假设“总线 004 设备 001”将始终是“USB 根集线器”,因此 dmesg 将从 1 开始计数,而 lsusb 从 2 开始计数?

或者您对如何将设备 ID 与挂载点(在脚本内)相关联有其他建议吗?

我正在使用 Ubuntu 10.04 LTS。

4

3 回答 3

23

使用 sysfs 查找更多信息:

$ ls /sys/bus/usb-serial/devices/ -ltrah

lrwxrwxrwx 1 root root 0 2012-02-07 22:17 ttyUSB0 -> ../../../devices/pci0000:00/0000:00:0f.4/usb2/2-2/2-2:1.0/ttyUSB0

$ ls -ltrad /sys//devices/pci0000:00/0000:00:0f.4/usb2/2-2/2-2:1.0/ttyUSB0
drwxr-xr-x 4 root root 0 2012-02-07 22:17 /sys//devices/pci0000:00/0000:00:0f.4/usb2/2-2/2-2:1.0/ttyUSB0

$ ls -ltrad /dev/ttyUSB0 
crw-rw---- 1 root dialout 188, 0 2012-02-01 00:17 /dev/ttyUSB0

当然,linked devices/...节点包含很多信息

根据 OP 的评论添加信息:

如果设备被移除/插入,设备数量会持续增长。lsusb -t可用于将设备编号与 USB 总线/端口相关联。

然后,“lsusb -d devID”可以确定哪个设备在哪个端口上。最后 'ls /sys/bus/usb-serial/devices/ -ltrah' 将列出(按总线/端口)它的安装位置。

不是很方便,但它'工作'

于 2012-02-07T21:20:31.543 回答
13

您可以使用 udev 为每个 FTDI 加密狗分配一个稳定的符号链接。使用设备和供应商来匹配类型,然后是特定设备的序列号。然后在脚本中使用符号链接。

我将我的加密狗命名为 ttyFTDI0 等,并用记号笔在加密狗上写下数字:

$ cat /etc/udev/ftdi.rules
子系统=="usb", 内核=="ttyUSB*", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6001", ATTRS{serial}=="FTDEN97D", SYMLINK+="ttyFTDI0"
子系统=="usb", 内核=="ttyUSB*", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6001", ATTRS{serial}=="A600b30P", SYMLINK+="ttyFTDI1"
子系统=="usb", 内核=="ttyUSB*", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6001", ATTRS{serial}=="A600bexU", SYMLINK+="ttyFTDI2"
子系统=="usb", 内核=="ttyUSB*", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6001", ATTRS{serial}=="FTFMSA54", SYMLINK+="ttyFTDI3"
子系统=="usb", 内核=="ttyUSB*", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6001", ATTRS{serial}=="FTFMUW4A", SYMLINK+="ttyFTDI4"
于 2012-12-06T10:29:26.010 回答
1

这个单行 udev 规则将基于序列号为任何具有给定供应商/产品 ID 的设备提供一个固定名称(例如 /dev/ttyUSB_A9YL5BJJ)。

将其放入 udev 规则文件中,例如 /etc/udev/rules.d/60-ftdi-serial-names.rules

SUBSYSTEM=="tty", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6001", ENV{ID_SERIAL_SHORT}=="?*", SYMLINK+="ttyUSB_%E{ID_SERIAL_SHORT}"
于 2015-07-21T02:26:46.837 回答