Forum: PC-Programmierung Navigation im USB Tree


von B. W. (yesitsme)


Lesenswert?

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)?

von Norbert (der_norbert)


Lesenswert?

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"

von B. W. (yesitsme)


Lesenswert?

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

von Norbert (der_norbert)


Lesenswert?

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

von Εrnst B. (ernst)


Lesenswert?

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.

von Norbert (der_norbert)


Lesenswert?

Ε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.

von Gerd E. (robberknight)


Lesenswert?

Ε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
von B. W. (yesitsme)


Lesenswert?

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

von Εrnst B. (ernst)


Lesenswert?

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
Noch kein Account? Hier anmelden.