USB-Ports fest zuweisen
Serielle USB-Geräte sollen auch nach einem Neustart unter dem selben Pfad auffindbar sein. Nur werden diese Pfade bei der Initialisierungen manchmal vertauscht. Eine einfache udev Regel kann das Problem lösen.
Wenn der Raspberry Pi gestartet wird, werden die USB-Ports nicht immer in der gleichen Reihenfolge initialisiert. Angenommen, wir haben zwei Geräte dauerhaft mit dem Raspberry verbunden, sagen wir mal auf den USB-Ports 1 und 2. Die verbunden Geräte können wir uns mit dem Befehl "ls -l /dev/ttyUSB*" anzeigen lassen. Wir sehen, dass jeweils ein Gerät unter /dev/ttyUSB0 und /dev/ttyUSB1 (laufende Nummern, nicht fest zugewiesene USB-Ports) eingebunden ist.
Da wir diese Ports im Softwarecode ansprechen, ist es für uns wichtig, dass ttyUSB0 auch nach einem Reboot immer noch das gleiche Gerät ist wie vorher. Beim Starten des Raspberrys kann es allerdings vorkommen, dass ttyUSB0 aber nicht mehr der erste (Hardware-) USB-Port ist, sondern dass dieser Pfad dem zweiten Port zugewiesen wurde. Für die Software sind die Geräte also jetzt vertauscht und die dazugehörigen Funktionen können nicht mehr funktionieren. Das passiert zwar nicht unbedingt häufig, wenn es dann mal vorkommt ist es aber umso ärgerlicher. Ein Neustart könnte natürlich Abhilfe schaffen, aber das wäre ja zu einfach.
Wir erstellen stattdessen eine neue udev-Regel (userspace device), die besagt, dass die Ports immer einem bestimmten Pfad zugewiesen werden - unabhängig davon, welches ttyUSBx Gerät das letztendlich ist. Dafür erstellen wir eine neue Datei im Ordner "/etc/udev/rules.d/" und geben ihr den Namen "98-custom-tty.rules".

KERNEL=="ttyUSB*" - Es werden nur serielle Geräte gefiltert, unabhängig von der zugewiesenen Nummer
KERNELS=="1-1.1" - Der USB-Port, auf den die Regel angewandt wird. Die erste Zahl steht für den Bus, die zweite für den Hub und die dritte für den letztendlichen Port. (Siehe auch "lsusb -t")
SYMLINK+="ttyPKW1" - der Pfad, unter dem wir den Port erreichen wollen.
Danach laden wir die udev Regeln neu (udevadm control --reload-rules & sudo systemctl restart udev.service).
Jetzt können wir die verbundenen Geräte mit ls -l /dev/ttyPKW* anzeigen lassen und die Software fragt den entsprechenden Pfad ab, es ist letztendlich egal ob ttyUSB0 oder ttyUSB1 zugewiesen wurde.
Normalerweise werden solche Regeln mithilfe der Device ID erstellt, das geht auch ganz gut, solange man verschiedenen Devices von verschiedenen Herstellern benutzt. Wenn wir aber 2 USB-Serial Adapter vom selben Hersteller haben, dann haben diese unter Umständen identische IDs etc, können also rein von den Daten her nicht unterschieden werden (die Daten können wir zum Beispiel mit "udevadm info /dev/ttyUSB0" abfragen). Stattdessen weisen wir die Ports fest zu, damit die Pfade bei einem Reboot erhalten bleiben. Solange wir sicherstellen können, dass Gerät 1 immer auf dem selben Port angeschlossen ist, wird es unter dem verknüpften Pfad gefunden.
Die Nummerierung der Hardware-Ports am Raspberry Pi 4 sind folgende:
Port 1 - Am ETH-Anschluss, oben
Port 2 - Am ETH-Anschluss unten
Port 3 - Fern vom ETH-Anschluss oben
Port 4 - Fern vom ETH-Anschluss unten