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.
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
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'
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"
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}"