Ich habe ein Problem: Ich habe einen Aufbau aus meheren USB Geräten. Diese sind an einem USB Hub angeschlossen. An Port 1 wird ein /dev/ttyACM0 erkannt. Da es eine Seriennummer hat, kann ich mit pySerial über alle erkannten Ports enumerieren und die Seriennummer vergleichen. -> Kein Problem hier. An Port 2 habe ich ein /dev/ttyUSB0. Leider ohne Seriennummer. Da jenachdem was ich noch angeschlossen habe, sich die Namen ändern hier meine Frage: Wie komme ich am besten unter Linux und Python von /dev/ACM0 (den ich sicher finden kann) auf /dev/ttyUSB0 (der ein Port weiter eingesteckt ist)?
B. W. schrieb: > An Port 2 habe ich ein /dev/ttyUSB0. Leider ohne Seriennummer. > > Da jenachdem was ich noch angeschlossen habe, sich die Namen ändern hier > meine Frage: In ›/etc/udev/rules.d‹ eine Regel einführen, welche auf Vid:Pid triggert und einen eigens erstellten und benannten Link in /dev hinzu fügt. Habe mir vor Äonen so etwas erstellt:
1 | # stm32 discovery board with onboard st/linkv2 |
2 | SUBSYSTEMS=="usb", ATTRS{idVendor}=="0483", ATTRS{idProduct}=="3748", \ |
3 | MODE:="0666", \ |
4 | SYMLINK+="stlinkv2_%n" |
An sich eine gute Idee, aber leider haben die CH340 irgendwie alle die selbe VID:PID. Da bleibt dann noch die unterschiedliche Enumerierung bei Boot und Hotplug...
B. W. schrieb: > aber leider haben die CH340 irgendwie alle die > selbe VID:PID. Ahhh, diese Information gab's gerade noch nicht. Gleiche VID, gleiche PID, keine SERIAL. Device ──▶ /dev/null
Und wenn du mehrere Devices hast, die sich nicht durch VID/PID oder Seriennummer unterscheiden, kannst du die udev-Rule auch nach Device-Pfad unterscheiden, als z.B. je nachdem in welchen Port vom USB-Hub die gesteckt sind:
1 | ... ENV{ID_PATH}=="pci-0000:01:00.0-usb-0:2.3:1.0",SYMLINK+="ttyUSB_HUB_PORT3"... |
Im ENV{ID_PATH} - Match gehen Wildcards, Wenn es egal sein soll an welchem Mainboard-Port der Hub steckt, kannst du das entsprechend raus-'*'-en. Und wenn dir eigene UDEV-Rules suspekt sind, schau mal in die unterordner von /dev/serial, die Default-UDEV-Regeln legen da schon einige Symlinks an, die dir reichen könnten.
Εrnst B. schrieb: > Und wenn du mehrere Devices hast, die sich nicht durch VID/PID > oder > Seriennummer unterscheiden, kannst du die udev-Rule auch nach > Device-Pfad unterscheiden, Stimmt. Aber dann fliegt er blind, da die Geräte nicht unterscheidbar sind und nun ausschließlich von der Steckposition abhängen. Da braucht man große Aufkleber und blinkende Pfeile an den Hubs.
Εrnst B. schrieb: > Und wenn du mehrere Devices hast, die sich nicht durch VID/PID oder > Seriennummer unterscheiden, kannst du die udev-Rule auch nach > Device-Pfad unterscheiden, als z.B. je nachdem in welchen Port vom > USB-Hub die gesteckt sind: genau. > ENV{ID_PATH}=="pci-0000:01:00.0-usb-0:2.3:1.0",SYMLINK+="ttyUSB_HUB_PORT 3"... und um diesen ID_PATH herauszubekommen, kannst Du den udevadm-Befehl verwenden:
1 | udevadm info /dev/ttyUSB0 |
:
Bearbeitet durch User
Gerd E. schrieb: > udevadm info /dev/ttyUSB0 Hmm... mal schauen wie ich das parse...
1 | P: /devices/pci0000:00/0000:00:08.1/0000:29:00.3/usb5/5-1/5-1.1/5-1.1.2/5-1.1.2:1.0/ttyUSB1/tty/ttyUSB1 |
2 | P: /devices/pci0000:00/0000:00:08.1/0000:29:00.3/usb5/5-1/5-1.1/5-1.1.1/5-1.1.1:1.0/tty/ttyACM1 |
B. W. schrieb: > Hmm... mal schauen wie ich das parse... Schau nach der Zeile mit ID_PATH # udevadm info /dev/ttyACM1 |grep ID_PATH= E: ID_PATH=pci-0000:01:00.0-usb-0:2.3:1.0 das "E:" davor bedeutet, dass der Wert in der Rule mit ENV{} erreichbar ist.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.