Wie vorgeschlagen, können Sie einige udev-Regeln hinzufügen. Ich habe den /etc/udev/rules.d/10-local.rules
bearbeitet enthalten:
ACTION=="add", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6001", SYMLINK+="my_uart"
Sie können die Variablen Ihres Geräts überprüfen, indem Sie
ausführenudevadm info -a -p $(udevadm info -q path -n /dev/ttyUSB0)
Es gibt eine ausführlichere Anleitung, die Sie unter http://www.reactivated.net/writing_udev_rules.html
lesen können
Die obige Regelsyntax funktioniert möglicherweise auf einigen Distributionen, funktionierte jedoch nicht auf meiner (Raspbian). Da ich nie ein einziges Dokument gefunden habe, das alle Einzelheiten erklärt, habe ich mein eigenes geschrieben, das hier zu finden ist. Darauf läuft es hinaus.
1. Finden Sie heraus, was auf ttyUSB ist:
dmesg | grep ttyUSB
2. Alle Attribute des Geräts auflisten:
udevadm info --name=/dev/ttyUSBx --attribute-walk
(natürlich mit Ihrer(n) Gerätenummer(n) statt x). Wählen Sie einen eindeutigen Kennungssatz aus, z. B. idVendor + idProduct. Möglicherweise benötigen Sie auch die Seriennummer, wenn Sie mehr als ein Gerät mit demselben idVendor und idProduct haben. Seriennummern sollten für jedes Gerät eindeutig sein.
3. Erstellen Sie eine Datei /etc/udev/rules.d/99-usb-serial.rules
mit so etwas wie dieser Zeile darin:
SUBSYSTEM=="tty", ATTRS{idVendor}=="1234", ATTRS{idProduct}=="5678", SYMLINK+="your_device_name"
(vorausgesetzt, Sie benötigen dort keine Seriennummer, und natürlich mit den Nummern für idVendor und idProduct, die Sie in Schritt 2 gefunden haben.
4. Laden Sie die neue Regel:
sudo udevadm trigger
5. Überprüfen Sie, was passiert ist:
ls -l /dev/your_device_name
zeigt an, zu welcher ttyUSB-Nummer der Symlink ging. Wenn es /dev/ttyUSB1
ist , überprüfen Sie dann, wem das gehört und zu welcher Gruppe es gehört:
ls -l /dev/ttyUSB1
Dann nur so zum Spaß:
udevadm test -a -p $(udevadm info -q path -n /dev/your_device_name)
Das Problem mit mehreren identischen USB-Geräten
Ich habe einen Rasperry Pi mit vier Kameras. Ich mache Bilder mit fswebcam
die die Kameras als /dev/video0
identifiziert .. video3
. Manchmal ist die Kamera video0
, vide02
, video4
und video6
aber das können wir jetzt vergessen.
Ich brauche eine persistente ID, um eine Kameranummer zu identifizieren, damit z. video0
ist immer die selbe kamera weil ich die bilder beschrifte. Leider geschieht dies nicht zuverlässig - beim Booten werden die Kameras als video0
aufgelistet ..video3
aber nicht immer gleich.
Die Kameras haben alle dieselbe ID und Seriennummer.
Die Lösung für dieses Problem beinhaltet udev-Regeln, aber es gibt dort auch viele Angelhaken.
Wenn Sie den Befehl
ausgebenudevadm info –attribute-walk –path=/dev/video0
Sie erhalten eine Reihe von Ergebnissen, aber die hervorstechenden Teile sind
KERNEL=”video0”, SUBSYSTEM=”video4linux” and KERNELS=”1:1.2.4:1.0”.
Das KERNELS-Bit ist ein USB-Hub-Port. Bei vier Kameras sind es vier davon - sie ändern sich beim Neustart nicht, aber die video{x}
einem Port zugeordnet darf ändern.
Wir brauchen also eine udev-Regel, um eine Videonummer an einen USB-Hub-Port zu binden - so etwas wie:
KERNEL==”video0”,SUBSYSTEM=”video4linux”,KERNELS==”1:1.2.4:1.0”,SYMLINK+=”camera0”
Sieht einfach aus – greifen Sie mit
auf die Kamera zufswebcam –d $realpath /dev/camera0
Nur dass es nicht funktioniert – wenn Sie dies in eine udev-Regel einfügen und das System video0 (beim Booten) einem anderen Port zugewiesen hat, wird die udev-Regel ignoriert. Der symbolische Link zu /dev/camera0
sagt im Grunde no such device
. Platz eins.
Wir wollen einen Symlink an eine USB-Hub-Adresse binden, nicht an video{x}
Nummer. Es brauchte ein Python-Programm.
Der erste Schritt war zu laufen
fswebcam –d /dev/video${x} tst.jpg
für x
zwischen 1 und 8. Die Existenz von tst.jpg
erkennt nach jedem Anruf, ob auf dieser Videonummer eine Kamera vorhanden ist. Erstellen Sie daraus eine Liste mit aktiven Videonummern. Meiner Erfahrung nach ist es entweder 0,1,2,3
oder 0,2,4,6
für Kameras, die ich verwendet habe.
Andere können diese Liste natürlich mit einem anderen Verfahren erstellen.
Dann für jede Videonummer in der Liste run
udevadm info –attribute-walk –path=/dev/videox > dd
und entpacke den KERNELS= line
ab dd
. Nach diesem Vorgang erhalten Sie eine Liste der USB-Port-Adressen für die Kameras. Sortieren Sie diese Liste so, dass Sie sie im nächsten Schritt immer in der gleichen Reihenfolge abarbeiten. Nennen Sie dies die "Adressliste".
Führen Sie udevadm … > dd
aus Ding noch einmal und erstelle eine Liste, die so aussieht
KERNEL==”video0”, SUBSYSTEM=”video4linux”,KERNELS==”1:1.2.4:1.0 ”,SYMLINK+=”camerax”. Call this the “video list”.
Gehen Sie nun die Adressliste durch - suchen Sie zu jedem Eintrag den entsprechenden Eintrag aus der Videoliste. Erstellen Sie eine neue Liste, die wie eine Ansammlung von Zeilen wie
aussiehtKERNEL==”video0”, SUBSYSTEM=”video4linux”,KERNELS==”1:1.2.4:1.0 ”,SYMLINK+=”camera2”
Das x (Symlink-Nummer) wird durch die Sequenznummer in der Adressliste ersetzt.
Jetzt haben Sie eine udev-Regel, die funktioniert. Ein symbolischer Link, der an eine USB-Hub-Adresse gebunden ist, unabhängig davon, welche Videonummer diesem Port beim Booten zugewiesen wird.
Schreiben Sie die endgültige Liste in eine Datei /etc/udev/rules.d/cam.rules
. Führen Sie udevadm trigger
aus um es zu aktivieren und die Arbeit ist erledigt. /dev/camera2
immer dieselbe Kamera (USB-Anschluss) sein, unabhängig von ihrer Videonummer.