Как узнать какое устройство USB-RS232 на каком tty?

У меня два разных 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".

Могу ли я предположить, что "Устройство 001 Bus 004" всегда будет "корневым концентратором USB" и, таким образом, dmesg будет считать с 1 года и lsusb с 2 года?

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

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

3 ответа

Решение

Найти больше информации, используя 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' покажет (по шине / порту), где он был смонтирован.

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

Вы можете использовать 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"

Это однострочное правило 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}"
Другие вопросы по тегам