Как узнать, какое устройство USB-RS232 находится на каком tty?
У меня есть два разных USB-устройства, основанных на тех же чипах USB-RS232.
Когда я подключаю их к USB, они монтируются в /dev/ttyUSB 0... 3
Моя проблема в том, как внутри script я могу узнать, какой из них находится на 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".
Можно ли предположить, что "Bus 004 Device 001" всегда будет "корневым центром USB", и поэтому dmesg будет отсчитывать от 1 до и lsusb от 2 до?
Или у вас есть другое предложение о том, как соотнести идентификатор устройства с точкой монтирования (внутри script)?
Я использую Ubuntu 10.04 LTS.
Ответы
Ответ 1
Найти больше информации с помощью 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
Конечно, связанные устройства /... node содержат много информации
Добавление информации на основе комментария OP:
Номер устройства продолжает расти, если устройства удалены/вставлены. lsusb -t
может использоваться для корреляции номеров устройств с шиной USB/портом.
Затем "lsusb -d devID" может определить, какое устройство находится на каком порту.
Наконец 'ls/sys/bus/usb-serial/devices/-ltrah' перечислит (по шине/порту), где он был установлен.
Не очень удобно, но он работает
Ответ 2
Вы можете использовать udev для назначения стабильной символической ссылки для каждого ключа FTDI.
Используйте устройство и поставщика для соответствия типу, а затем серийный номер для определенного устройства. Затем используйте символическую ссылку в script.
Я назвал свои dongles ttyFTDI0 и т.д., и написал числа на ключах с маркером:
$ cat /etc/udev/ftdi.rules
SUBSYSTEMS=="usb", KERNEL=="ttyUSB*", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6001", ATTRS{serial}=="FTDEN97D", SYMLINK+="ttyFTDI0"
SUBSYSTEMS=="usb", KERNEL=="ttyUSB*", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6001", ATTRS{serial}=="A600b30P", SYMLINK+="ttyFTDI1"
SUBSYSTEMS=="usb", KERNEL=="ttyUSB*", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6001", ATTRS{serial}=="A600bexU", SYMLINK+="ttyFTDI2"
SUBSYSTEMS=="usb", KERNEL=="ttyUSB*", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6001", ATTRS{serial}=="FTFMSA54", SYMLINK+="ttyFTDI3"
SUBSYSTEMS=="usb", KERNEL=="ttyUSB*", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6001", ATTRS{serial}=="FTFMUW4A", SYMLINK+="ttyFTDI4"
Ответ 3
Этот однострочный файл предоставит фиксированное имя на основе серийного номера, например ttyUSB_A9YL5BJJ для любого устройства с идентификаторами поставщика/продукта, как указано
SUBSYSTEM=="tty", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6001", ENV{ID_SERIAL_SHORT}=="?*", SYMLINK+="ttyUSB_%E{ID_SERIAL_SHORT}"