• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

Mounten von Serial/USB Adapter?

Ich habe folgendes "Problem": Ich verwende einen USB/Serial Adapter um einen uController zu steuern. Ich verwende dazu Shell-Scripts. Funktioniert schon mal wunderbar. Wenn ich jedoch einen zweiten USB-Adapter während des Bootens angesteckt habe ändert sich die Geräteadresse von /dev/ttyUSB0 auf /dev/ttyUSB1 (der "neue" hat jetzt ...USB0). Meine Shellscript - Dateien greifen jetzt auf den falschen USB-Stick. Wie löst man dieses Problem? Soll/kann man das Gerät so wie Festplatten auf ein Laufwerk in der fstab mounten? Falls ja, wie müsste der Befehl aussehen?
 

josef-wien

Ultimate Guru
Findest Du unter /dev/serial/by-id/ eine (unabhängig von der Reihenfolge des Einsteckens) eindeutige Verknüpfung, die Dein Skript verwenden kann? Wenn nicht, müßte eine solche mit einer eigenen udev-Regel erzeugt werden.
 

spoensche

Moderator
Teammitglied
Das Problem kannst du umgehen, in dem du die Gerätedatei nicht statisch in deinen Code einbaust. D.h. die Gerätedatei gibst du dem Script beim Aufruf mit oder lässt das Script eine Konfigurationsdatei verwenden.

Alternativ kannst du auch die Hardwareeigenschaften auslesen und anhand dieser ermitteln, ob es das gewünschte Device ist. Eleganter und lehrreicher wäre es definitiv.
 
OP
V

veryprivat

Member
@josef-wien:
Guter Tipp, danke dafür. Interessant ist allerdings das Verhalten: Es existiert immer nur eine Datei (egal ob ich ein oder zwei Adapter angeschlossen habe):
Code:
ls /dev/serial/by-id/
usb-Prolific_Technology_Inc._USB-Serial_Controller-if00-port0
und: Diese verweist immer auf /dev/ttyUSB0 - also wenn nur einer eingesteckt ist auf den richtigen - wenn beide eingesteckt sind auf den falschen (wie bisher). Aber was Hilfreich sein könnte:
Code:
ls /dev/serial/by-path
pci-0000:07:00.0-usb-0:1.2:1.0-port0  pci-0000:07:00.0-usb-0:1.3:1.0-port0
Hier sehe ich beide Adapter. Da ich die Steuerung für den Controller fix verkabelt habe steckt der Adapter dafür auch immer am gleichen USB Port.
@spoensche:
Guter Vorschlag das mit der Konfigurationsdatei - habe ich gleich umgesetzt. Ich möchte allerdings nicht immer die Datei von Hand ändern, wenn ich einen weiteren Adapter anschließe. Deshalb scheint mir der Eintrag /dev/serial/by-path/pci-0000:07:00.0-usb-0:1.3:1.0-port0 (aufgrund Hinweis von josef-wien) der geeignetere Eintrag. Was mich etwas stört: Ich muss den gesamten Pfad der "Konfigurationsdatei" angeben, da der Befehl
Code:
 SerialPort=$(cat ./SerialPort.txt)
nur funktioniert, wenn ich die Datei .sh Datei aus ihrem Verzeichnis aufrufe. Starte ich von einem anderen Verzeichnis (was bei Autostart der Fall ist) funktioniert das Ganze nicht mehr - bzw. nur mit absoluter Pfadangabe...
Ich wüsste nicht, wie ich die Hardwareeigenschaften auslesen müsste, damit es noch besser funktioniert, da die Geräte scheinbar gleich heißen:
Code:
lsusb
...
Bus 005 Device 003: ID 067b:2303 Prolific Technology, Inc. PL2303 Serial Port
Bus 005 Device 004: ID 067b:2303 Prolific Technology, Inc. PL2303 Serial Port
...
Für weitere Hinweise wäre ich dankbar - ansonsten bin ich mit der bisherigen Lösung auch ganz zufrieden (habe allerdings noch nicht viel getestet).
 

abgdf

Guru
veryprivat schrieb:
Was mich etwas stört: Ich muss den gesamten Pfad der "Konfigurationsdatei" angeben, da der Befehl
Code:
SerialPort=$(cat ./SerialPort.txt)
nur funktioniert, wenn ich die Datei .sh Datei aus ihrem Verzeichnis aufrufe. Starte ich von einem anderen Verzeichnis (was bei Autostart der Fall ist) funktioniert das Ganze nicht mehr - bzw. nur mit absoluter Pfadangabe...
Normalerweise liegen Konfigurationsdateien ja in "/home/user" (meist haben sie auch einen Punkt davor, um sie "unsichtbar" zu machen). Wenn Du Dein SerialPort.txt in "/home/user" hast, kannst Du mit
Code:
SerialPort=$(cat ~/SerialPort.txt)
einlesen.
P.S.: War gerade nicht sicher, ob das Einlesen mit cat die beste Methode in der Shell ist, aber es scheint für die meisten Fälle ok zu sein.
 

josef-wien

Ultimate Guru
Bei Deinen Zwillingen sind die udev-Umgebungsvariablen ID_BUS, ID_SERIAL, ID_USB_INTERFACE_NUM und ID_PORT identisch, daher gibt es unter by-id nur einen Eintrag. Ich fürchte, wenn Du die Ergebnisse der für beide Adapter ausgeführten Befehle
Code:
/sbin/udevadm info -p $(/sbin/udevadm info -q path -n /dev/ttyUSBx)
/sbin/udevadm info -a -p $(/sbin/udevadm info -q path -n /dev/ttyUSBx)
vergleichst, wirst Du außer bei den anschlußbezogenen Daten keine Unterschiede finden, somit bleibt nur Dein Weg, für jedes Gerät immer denselben Anschluß zu verwenden.
 
OP
V

veryprivat

Member
abgdf schrieb:
Normalerweise liegen Konfigurationsdateien ja in "/home/user"
Ich hätte es halt gerne gaaaannnz einfach gehabt: Irgendwo ablegen und bei Bedarf ausführen. Aber Dein Vorschlag hat einen Vorteil - ich muss nur einmal die Konfigurationsdatei dort hin kopieren (zur Not per Script) und es läuft. Bei meiner Pfadangabe muss ich alle shellscripts anpassen falls sich mal was ändert - danke für den Vorschlag -> wird umgesetzt :D

josef-wien schrieb:
Ich fürchte, wenn Du die Ergebnisse der für beide Adapter ausgeführten Befehle
/sbin/udevadm info -p $(/sbin/udevadm info -q path -n /dev/ttyUSBx)
/sbin/udevadm info -a -p $(/sbin/udevadm info -q path -n /dev/ttyUSBx)
vergleichst, wirst Du außer bei den anschlußbezogenen Daten keine Unterschiede finden, somit bleibt nur Dein Weg, für jedes Gerät immer denselben Anschluß zu verwenden.
Für mich sieht es auch so aus als würden die beiden Befehle nur bezüglich des Anschlusses (und der Initialisierungszeit) einen unterschiedlichen Wert liefern :(:
Code:
~> /sbin/udevadm info -p $(/sbin/udevadm info -q path -n /dev/ttyUSB0)
P: /devices/pci0000:00/0000:00:1c.7/0000:07:00.0/usb5/5-1/5-1.2/5-1.2:1.0/ttyUSB0/tty/ttyUSB0
N: ttyUSB0
S: serial/by-id/usb-Prolific_Technology_Inc._USB-Serial_Controller-if00-port0
S: serial/by-path/pci-0000:07:00.0-usb-0:1.2:1.0-port0
E: DEVLINKS=/dev/serial/by-id/usb-Prolific_Technology_Inc._USB-Serial_Controller-if00-port0 /dev/serial/by-path/pci-0000:07:00.0-usb-0:1.2:1.0-port0
E: DEVNAME=/dev/ttyUSB0
E: DEVPATH=/devices/pci0000:00/0000:00:1c.7/0000:07:00.0/usb5/5-1/5-1.2/5-1.2:1.0/ttyUSB0/tty/ttyUSB0
E: ID_BUS=usb
E: ID_MM_CANDIDATE=1
E: ID_MODEL=USB-Serial_Controller
E: ID_MODEL_ENC=USB-Serial\x20Controller
E: ID_MODEL_FROM_DATABASE=PL2303 Serial Port
E: ID_MODEL_ID=2303
E: ID_PATH=pci-0000:07:00.0-usb-0:1.2:1.0
E: ID_PATH_TAG=pci-0000_07_00_0-usb-0_1_2_1_0
E: ID_REVISION=0300
E: ID_SERIAL=Prolific_Technology_Inc._USB-Serial_Controller
E: ID_TYPE=generic
E: ID_USB_DRIVER=pl2303
E: ID_USB_INTERFACES=:ff0000:
E: ID_USB_INTERFACE_NUM=00
E: ID_VENDOR=Prolific_Technology_Inc.
E: ID_VENDOR_ENC=Prolific\x20Technology\x20Inc.
E: ID_VENDOR_FROM_DATABASE=Prolific Technology, Inc.
E: ID_VENDOR_ID=067b
E: MAJOR=188
E: MINOR=0
E: SUBSYSTEM=tty
E: TAGS=:systemd:
E: USEC_INITIALIZED=26353
E: hotplugscript=/etc/.mplab_ide/mchplinusbdevice
E: seghotplugscript=/etc/.mplab_ide/mchpsegusbdevice
Code:
~> /sbin/udevadm info -p $(/sbin/udevadm info -q path -n /dev/ttyUSB1)
P: /devices/pci0000:00/0000:00:1c.7/0000:07:00.0/usb5/5-1/5-1.3/5-1.3:1.0/ttyUSB1/tty/ttyUSB1
N: ttyUSB1
S: serial/by-id/usb-Prolific_Technology_Inc._USB-Serial_Controller-if00-port0
S: serial/by-path/pci-0000:07:00.0-usb-0:1.3:1.0-port0
E: DEVLINKS=/dev/serial/by-id/usb-Prolific_Technology_Inc._USB-Serial_Controller-if00-port0 /dev/serial/by-path/pci-0000:07:00.0-usb-0:1.3:1.0-port0
E: DEVNAME=/dev/ttyUSB1
E: DEVPATH=/devices/pci0000:00/0000:00:1c.7/0000:07:00.0/usb5/5-1/5-1.3/5-1.3:1.0/ttyUSB1/tty/ttyUSB1
E: ID_BUS=usb
E: ID_MM_CANDIDATE=1
E: ID_MODEL=USB-Serial_Controller
E: ID_MODEL_ENC=USB-Serial\x20Controller
E: ID_MODEL_FROM_DATABASE=PL2303 Serial Port
E: ID_MODEL_ID=2303
E: ID_PATH=pci-0000:07:00.0-usb-0:1.3:1.0
E: ID_PATH_TAG=pci-0000_07_00_0-usb-0_1_3_1_0
E: ID_REVISION=0300
E: ID_SERIAL=Prolific_Technology_Inc._USB-Serial_Controller
E: ID_TYPE=generic
E: ID_USB_DRIVER=pl2303
E: ID_USB_INTERFACES=:ff0000:
E: ID_USB_INTERFACE_NUM=00
E: ID_VENDOR=Prolific_Technology_Inc.
E: ID_VENDOR_ENC=Prolific\x20Technology\x20Inc.
E: ID_VENDOR_FROM_DATABASE=Prolific Technology, Inc.
E: ID_VENDOR_ID=067b
E: MAJOR=188
E: MINOR=1
E: SUBSYSTEM=tty
E: TAGS=:systemd:
E: USEC_INITIALIZED=26377
E: hotplugscript=/etc/.mplab_ide/mchplinusbdevice
E: seghotplugscript=/etc/.mplab_ide/mchpsegusbdevice
 
Oben