Как узнать какое устройство USB-RS232 на каком tty? - PullRequest
25 голосов
/ 08 февраля 2012

У меня два разных USB-устройства на базе одинаковых чипов USB-RS232 Когда я подключаю их к 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 Bus 004" всегда будет "корневым концентратором USB" и, таким образом, dmesg будет считать от 1 года и lsusb от 2 года?

Или у вас есть другое предложение о том, как соотнести идентификатор устройства с точкой монтирования (внутри скрипта)?

Я использую Ubuntu 10.04 LTS.

Ответы [ 3 ]

23 голосов
/ 08 февраля 2012

Найти больше информации, используя 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

Конечно, узел связанных устройств / ... содержит много информации

Добавление информации на основе комментария ОП:

Номер устройства продолжает расти, если устройства извлекаются / вставляются. lsusb -t может использоваться для сопоставления номеров устройств с шиной / портом USB.

Затем «lsusb -d devID» может определить, какое устройство и на каком порту. Наконец, 'ls / sys / bus / usb-serial / devices / -ltrah' покажет (по шине / порту), где он был смонтирован.

Не очень удобно, но это ' работает '

13 голосов
/ 06 декабря 2012

Вы можете использовать udev для назначения стабильной символической ссылки каждому ключу FTDI. Используйте устройство и поставщика, чтобы соответствовать типу, а затем серийный номер для конкретного устройства. Затем используйте символическую ссылку в скрипте.

Я назвал свои ключи 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"
1 голос
/ 21 июля 2015

Это однострочное правило udev дает фиксированное имя (например, / 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}"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...