Подтвердить что ты не робот

Как узнать, какое устройство 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.

4b9b3361

Ответ 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}"