web-dev-qa-db-de.com

Wie finde ich heraus, welches USB-RS232-Gerät an welchem ​​Tty angeschlossen ist?

Ich habe zwei verschiedene USB-Geräte, die auf denselben USB-RS232-Chips basieren. Wenn ich diese in den USB stecke, werden sie in /dev/ttyUSB0...3 gemountet

Mein Problem ist, wie ich in einem Skript herausfinden kann, welches auf welchem ​​Tty ist.

Mit lsusb kann ich sie unterscheiden:

$> 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

Und mit Dmesg kann ich sagen, wo sie montiert wurden:

$> 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" scheint aber nicht "Bus 004 Device 002" zu entsprechen.

Kann ich davon ausgehen, dass "Bus 004 Device 001" immer ein "USB-Root-Hub" ist und dmesg daher ab 1 und lsusb ab 2 zählt?

Oder haben Sie einen anderen Vorschlag, wie Sie die Geräte-ID mit dem Bereitstellungspunkt (innerhalb eines Skripts) korrelieren können?

Ich benutze Ubuntu 10.04 LTS.

25
gabriel_agm

Weitere Informationen finden Sie mit 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

Natürlich enthält der Knoten "Verknüpfte Geräte/..." viele Informationen

Hinzufügen von Informationen basierend auf dem Kommentar des OP:

Die Gerätenummer wächst weiter, wenn Geräte entfernt/eingefügt werden. lsusb -t kann verwendet werden, um die Gerätenummern mit dem USB-Bus/Port zu korrelieren.

Dann kann 'lsusb -d devID' feststellen, welches Gerät an welchem ​​Port angeschlossen ist. Schließlich listet 'ls/sys/bus/usb-serial/devices/-ltrah' (nach Bus/Port) auf, wo es gemountet wurde.

Nicht sehr praktisch, aber es 'funktioniert'

23
sehe

Mit udev können Sie jedem FTDI-Dongle eine stabile symbolische Verknüpfung zuweisen. Verwenden Sie Gerät und Hersteller, um den Typ und dann die Seriennummer für das jeweilige Gerät zu ermitteln. Verwenden Sie dann den symbolischen Link im Skript.

Ich nannte meine Dongles ttyFTDI0 usw. und schrieb die Nummern mit einem Marker auf die Dongles:

 $ 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" 
13
starblue

Diese einzeilige udev-Regel gibt einen festen Namen (z. B./dev/ttyUSB_A9YL5BJJ) basierend auf der Seriennummer für jedes Gerät mit den angegebenen Hersteller-/Produkt-IDs.

Fügen Sie dies in eine udev rules-Datei ein, z. /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}"