Forum: PC Hard- und Software Adapter USB-Serial in Linux/Ubuntu soll immer ttyUSB5 sein


von bastler (Gast)


Lesenswert?

wie im Thema schon zu sehen: Ich verwende Ubuntu und stecke dort 
verschiedene Geräte per USB an, z.B. seriell zu USB-Wandler (FTDI).

Jetzt wäre es schön, wenn ein bestimmtes Gerät beim Anstecken immer 
ttyUSB5 heissen könnte, damit ich das in den Anwendungsprogrammen fest 
so einstellen kann. Momentan heißt es mal ttyUSB0, mal ttyUSB1 und mal 
ttyACM0,1,2,3.. ich bin vom vielen Testen schon ganz durcheinander.

Nun habe ich gegoogelt, und etwas von udev-Regeln gelesen, was mit etwas 
kompliziert vorkam. Ist das die richtige, und auch die einfachste 
Lösung, oder gibt es einfachere Alternativen, die ich übersehen habe?

Wie macht Ihr das?

von Peter II (Gast)


Lesenswert?

bastler schrieb:
> Nun habe ich gegoogelt, und etwas von udev-Regeln gelesen, was mit etwas
> kompliziert vorkam. Ist das die richtige, und auch die einfachste
> Lösung

ja, aber sinnvollerweise vergibt man dann nicht ttyUSB5 sondern einen 
sinnvollen Namen ( /dev/ttyMeinTollesGerät )

von bastler (Gast)


Lesenswert?

Peter II schrieb:
> ja, aber sinnvollerweise vergibt man dann nicht ttyUSB5 sondern einen
> sinnvollen Namen ( /dev/ttyMeinTollesGerät )

Da hätte ich Skrupel wegen des Umlauts.. :-) aber ok dann muss ich da 
wohl durch.

von Hannes J. (Firma: _⌨_) (pnuebergang)


Lesenswert?

bastler schrieb:
> Nun habe ich gegoogelt, und etwas von udev-Regeln gelesen, was mit etwas
> kompliziert vorkam.

Das ist eigentlich ganz simpel. Man sieht einmal mit lsusb -v nach mit 
welchen Informationen sich das Gerät am USB-Bus identifiziert.

Man entscheidet sich für eine möglichst eindeutige Kombination dieser 
Daten. Gut ist z.B. eine Kombination aus idVendor, idProduct und serial. 
Allerdings haben Billig-Geräte häufig keine eindeutige Seriennummer, so 
dass man manchmal nur mit idVendor und idProduct auskommen muss.

Damit ist die Regel schon fertig:
1
SUBSYSTEMS=="usb", ATTRS{idVendor}=="<VVVV>", ATTRS{idProduct}=="<PPPP>", ATTRS{serial}=="<SSSSSSSSSSSSS>", SYMLINK+="ttyMeinTollesGeraet"

Den ATTRS{serial}== Teil weglassen wenn man keine eindeutige 
Seriennummer hat. <...> durch die mit lsusb -v gefundenen Werte 
ersetzen.

> Ist das die richtige, und auch die einfachste
> Lösung,

Es ist die gängigste. Leider hat, soweit ich weiß, noch niemand eine 
einfache GUI zur Auswahl und Automatisierung des Vorgangs geschrieben.

> oder gibt es einfachere Alternativen, die ich übersehen habe?

Na ja, ich gehe meistens hin und schreibe meine Software so, dass ich in 
der Software die idVendor (die VID), idProduct (die PID) und ev. die 
Seriennummer eingeben kann. Bei spezieller Software für ein bestimmtes 
Gerät codiert ich die VID/PID sogar fest in der Software. Dann suche ich 
mit der libusb nach dem entsprechenden Gerät ohne das der User sich drum 
kümmern muss wie es unter /dev heißt. Früher habe ich auch schon mal 
sysfs nach der VID/PID durchsucht.

von Peter II (Gast)


Lesenswert?

Hannes J. schrieb:
> Dann suche ich
> mit der libusb nach dem entsprechenden Gerät ohne das der User sich drum
> kümmern muss wie es unter /dev heißt. Früher habe ich auch schon mal
> sysfs nach der VID/PID durchsucht.

dafür kann man auch libudev verwenden, da kann man sich alle geräte 
auflisten lassen oder bekommt sogar Events wenn welche erkannt werden. 
Bei meine Anwendung kann ich im Betrieb die Geräte anstecken.

von bastler (Gast)


Lesenswert?

jetzt bin ich etwas weiter: Ich habe diese Datei 
/etc/udev/rules.d/11-usb2serial.rules erstellt:

#Serial to USB Adapter
SUBSYSTEMS=="usb", ATTRS{idVendor}=="067b", ATTRS{idProduct}=="2303", 
NAME="ttyUsb2Serial", SYMLINK+="ttyUsb2Serial"

Beim Einstecken sehe ich das im syslog:

Jun  4 18:11:35 THINKPAD kernel: [769113.461725] usb 1-1.2: new 
full-speed USB device number 20 using ehci-pci
Jun  4 18:11:35 THINKPAD kernel: [769113.555394] usb 1-1.2: New USB 
device found, idVendor=067b, idProduct=2303
Jun  4 18:11:35 THINKPAD kernel: [769113.555403] usb 1-1.2: New USB 
device strings: Mfr=1, Product=2, SerialNumber=0
Jun  4 18:11:35 THINKPAD kernel: [769113.555409] usb 1-1.2: Product: 
USB-Serial Controller
Jun  4 18:11:35 THINKPAD kernel: [769113.555413] usb 1-1.2: 
Manufacturer: Prolific Technology Inc.
Jun  4 18:11:35 THINKPAD kernel: [769113.556405] pl2303 1-1.2:1.0: 
pl2303 converter detected
Jun  4 18:11:35 THINKPAD systemd-udevd[15954]: NAME="ttyUsb2Serial" 
ignored, kernel device nodes can not be renamed; please fix it in 
/etc/udev/rules.d/11-usb2serial.rules:2
Jun  4 18:11:35 THINKPAD kernel: [769113.558804] usb 1-1.2: pl2303 
converter now attached to ttyUSB0
Jun  4 18:11:35 THINKPAD mtp-probe: checking bus 1, device 20: 
"/sys/devices/pci0000:00/0000:00:1a.0/usb1/1-1/1-1.2"
Jun  4 18:11:35 THINKPAD mtp-probe: bus: 1, device: 20 was not an MTP 
device
Jun  4 18:11:36 THINKPAD systemd-udevd[15954]: NAME="ttyUsb2Serial" 
ignored, kernel device nodes can not be renamed; please fix it in 
/etc/udev/rules.d/11-usb2serial.rules:2

Es gibt nach dem Anstecken unter /dev einen Symlink mit dem richtigen 
Namen. Das "NAME=" habe ich eingefügt in der Hoffnung, dass ich dann 
z.B. in Arduino / serieller Port diesen Namen sehen kann (ttyUsb2Serial) 
- das ist aber nicht der Fall. Kann ich das erreichen / wie?

Den Parameter "Kernel" hab ich nicht verstanden, evtl. brauche ich den 
nicht?

von eagle user (Gast)


Lesenswert?

bastler schrieb:

> Beim Einstecken sehe ich das im syslog:
>
> Jun  4 18:11:35 THINKPAD kernel: [769113.556405] pl2303 1-1.2:1.0:
> pl2303 converter detected
>
> Das "NAME=" habe ich eingefügt in der Hoffnung, dass ich dann
> z.B. in Arduino / serieller Port diesen Namen sehen kann (ttyUsb2Serial)
> - das ist aber nicht der Fall. Kann ich das erreichen / wie?

Der Kernel antwortet auf die Escape-Sequenz DA (Device Attributes) mit 
'\e[?64;1;2;6;9;15;18;21;22c' oder '\e[?6c'. Der Arduino müsste also 
'\e[c' senden und auf '\e'-irgendwas warten. Auf der Kommandozeile kann 
man das testen:
1
echo -e -n '\e[c'
Keine Ahnung, ob das auch über ein ttyUSB funktioniert.

von bastler (Gast)


Lesenswert?

eagle user schrieb:
> Der Arduino müsste also
> '\e[c' senden und auf '\e'-irgendwas warten.

Ich meinte nicht ein angeschlossenes Gerät, sondern in der Arduino IDE 
kann man unter Tools / serieller Port den Port auswählen, den man 
benutzen will - in dieser Auflistung tauchen nur die Geräte ttyUSB.. 
auf, aber nicht mein ttyUsb2serial..

von T.roll (Gast)


Lesenswert?

bastler schrieb:
> NAME="ttyUsb2Serial"
> ignored, kernel device nodes can not be renamed; please fix it in
> /etc/udev/rules.d/11-usb2serial.rules:2

Kernel ist kein Parameter, sondern das Betriebssystem

Die Meldung bedeutet du sollst den Parameter NAME="" weg lassen (woher 
hast du den überhaupt?), da du vom Kernel vergebene Namen nicht ändern 
kannst. Dafür gibt es ja SYMLINK.

von bastler (Gast)


Lesenswert?

T.roll schrieb:
> woher
> hast du den überhaupt?

von hier: https://ubuntuforums.org/showthread.php?t=168221

T.roll schrieb:
> Kernel ist kein Parameter, sondern das Betriebssystem

glaub ich nicht, wenn man den Link oben liest

T.roll schrieb:
> da du vom Kernel vergebene Namen nicht ändern
> kannst. Dafür gibt es ja SYMLINK.

das heißt mit udev kann ich überhaupt NUR symlinks erstellen?

Ich möchte halt gerne erreichen, dass der Kernel nicht "ttyUSB0" draus 
macht, sondern "ttyUsb2Serial"

von eagle user (Gast)


Lesenswert?

bastler schrieb:

> Es gibt nach dem Anstecken unter /dev einen Symlink mit dem
> richtigen Namen.

Nur erscheint der nicht automatisch im IDE-Fenster. Vielleicht muss 
man die Liste manuell aktualisieren, zur Not mit IDE-Neustart.

Aber:
> Jetzt wäre es schön, wenn ein bestimmtes Gerät beim Anstecken immer
> ttyUSB5 heissen könnte, damit ich das in den Anwendungsprogrammen
> fest so einstellen kann.

Vielleicht kannst du "/dev/ttyUsb2Serial" irgendwo eintragen, auch wenn 
es nicht angezeigt wird. Nachdem der Name jetzt fest ist, sollte das 
doch ausreichen.

> das heißt mit udev kann ich überhaupt NUR symlinks erstellen?

Sieht so aus; die udev-Warnung wurde 2012 eingebaut, ungefähr seitdem 
dürfte NAME= nicht mehr funktionieren -- der Beitrag im ubuntuforum ist 
von 2006.

> Ich möchte halt gerne erreichen, dass der Kernel nicht "ttyUSB0"
> draus macht, sondern "ttyUsb2Serial"

Das dürfte sehr schwierig sein, es ist einfach nicht vorgesehen. Die 
offizielle Lösung ist der Symlink. Und normalerweise kann ein Programm 
den Symlink genauso wie das "echte" /dev/ttyUSB benutzen. Es merkt dabei 
keinen Unterschied wenn es nicht gezielt nachforscht. Die automatische 
Anzeige beim Einstecken ist allerdings nicht so einfach.

von bastler (Gast)


Lesenswert?

eagle user schrieb:
> Die
> offizielle Lösung ist der Symlink.

ich habe ein wenig getestet - der VMWare-Player z.B. kommt mit den 
Symlinks wunderbar zurecht (also die funktionieren auch). Meine Arduino 
IDE ist ja schon aus dem letzten Jahr und damit evtl. etwas alt.

Ich komme damit zurecht - danke an alle.

von bastler (Gast)


Lesenswert?

ich habe übrigens (noch nicht getestet) auch eine Lösung für Arduino 
gefunden - da muss man erst mal drauf kommen:

https://forum.arduino.cc/index.php?topic=387200.0

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.