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