Ich habe ein Arduino, an das manchmal /dev/ttyUSB0
und manchmal etwas gebunden ist /dev/ttyUSB1
, wodurch mein Skript fehlschlägt.
Ich möchte nicht alle Möglichkeiten aufzählen, wo sich mein Gerät befinden könnte, aber ich möchte lieber, dass es an einen statischen Ort gebunden wird, z /dev/arduino
.
Wie erreiche ich das?
linux
arch-linux
usb
serial-port
arduino
k0pernikus
quelle
quelle
Antworten:
Wie vorgeschlagen, können Sie einige udev-Regeln hinzufügen. Ich habe das bearbeitet,
/etc/udev/rules.d/10-local.rules
um Folgendes zu enthalten:Sie können die Variablen Ihres Geräts überprüfen, indem Sie ausführen
Eine ausführlichere Anleitung finden Sie unter http://www.reactivated.net/writing_udev_rules.html
quelle
udevam
? Und es ist wichtig zu beachten, dassmy_uart
der Symlink unter erstellt/dev/my_uart
. Ich habe/dev/arduino
das erste Mal geschrieben und es ist fehlgeschlagen, solangearduino
es ausreicht.udevadm
sollte von selbst beenden, wenn es fertig ist.Die obige Regelsyntax funktioniert möglicherweise auf einigen Distributionen, auf meinen (Raspbian) jedoch nicht. Da ich nie ein einziges Dokument gefunden habe, das alle Einzelheiten erklärt, habe ich mein eigenes geschrieben, das hier zu finden ist . Darauf kommt es an.
1. Finde heraus, was auf ttyUSB läuft:
2. Alle Attribute des Geräts auflisten:
(natürlich mit Ihrer (n) Gerätenummer (n) anstelle von x). Wählen Sie einen eindeutigen Identifizierungssatz aus, z. B. idVendor + idProduct. Möglicherweise benötigen Sie auch die Seriennummer, wenn Sie mehr als ein Gerät mit demselben idVendor und demselben 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 der folgenden Zeile:(vorausgesetzt, Sie benötigen dort keine Seriennummer und natürlich die Nummern für idVendor und idProduct, die Sie in Schritt 2 gefunden haben.
4. Laden Sie die neue Regel:
5. Überprüfen Sie, was passiert ist:
Zeigt an, zu welcher ttyUSB-Nummer der Symlink gegangen ist. Wenn ja
/dev/ttyUSB1
, überprüfen Sie, wem das gehört und zu welcher Gruppe es gehört:Dann nur zum Spaß:
quelle
idVendor
undidProduct
genau gleich sind? (zwei Sensoren an identischen USB-UART-Modulen)udevadm info --name=/dev/ttyUSB1 --attribute-walk
für beide Geräte ausführen und nach Seriennummern suchen. Sie sollten für jedes Gerät eindeutig sein. Wenn Ihre Sensoren keine Seriennummer haben, können Sie angeben, was sie sind?Das Problem mit mehreren identischen USB-Geräten
Ich habe einen Rasperry Pi mit vier Kameras. Ich nehme pix mit
fswebcam
denen identifiziert die Kameras wie/dev/video0
..video3
. Manchmal ist die Kameravideo0
,vide02
,video4
undvideo6
doch können wir darüber jetzt vergessen.Ich benötige eine persistente ID, um eine Kameranummer zu identifizieren, damit z. B.
video0
immer die gleiche Kamera ist, da ich die Bilder beschrifte. Leider passiert dies nicht zuverlässig - beim Booten werden die Kameras mitvideo0
.. aufgelistet,video3
aber nicht immer auf die gleiche Weise.Die Kameras haben alle die gleiche ID und Seriennummer.
Die Lösung für dieses Problem beinhaltet udev-Regeln, aber es gibt auch viele Angelhaken.
Wenn Sie den Befehl ausgeben
Sie erhalten einen Estrich der Ausgabe, aber die hervorstechenden Teile sind
Das KERNELS-Bit ist ein USB-Hub-Port. Bei vier Kameras gibt es vier davon - sie ändern sich nicht beim Neustart, aber der
video{x}
mit einem Port verknüpfte kann sich ändern.Wir brauchen also eine udev-Regel, um eine Videonummer an einen USB-Hub-Port zu binden - so etwas wie:
Sieht einfach aus - greifen Sie mit auf die Kamera zu
Außer es funktioniert nicht - 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 Symlink
/dev/camera0
sagt im Grundeno such device
. Platz eins.Wir möchten einen Symlink an eine USB-Hub-Adresse binden, nicht an eine
video{x}
Nummer. Es dauerte ein Python-Programm.Der erste Schritt war zu rennen
für
x
zwischen 1 und 8. Das Vorhandenseintst.jpg
nach jedem Anruf gibt an, ob sich auf dieser Videonummer eine Kamera befindet. Daraus machen Sie eine Liste der aktiven Videonummern. Meine Erfahrung war, dass es entweder0,1,2,3
oder0,2,4,6
für Kameras ist, die ich benutzt habe.Andere können diese Liste natürlich mit einem anderen Verfahren erstellen.
Dann für jede Videonummer in der Liste ausführen
und extrahiere die
KERNELS= line
ausdd
. Nach diesem Vorgang erhalten Sie eine Liste der USB-Anschlussadressen für die Kameras. Sortieren Sie diese Liste so, dass Sie sie im nächsten Schritt immer in der gleichen Reihenfolge bearbeiten. Nennen Sie dies die "Adressliste".Führen Sie das
udevadm … > dd
Ding erneut aus und erstellen Sie eine Liste, die aussiehtBlättern Sie nun durch die Adressliste - für jeden Eintrag finden Sie den entsprechenden Eintrag aus der Videoliste. Erstellen Sie eine neue Liste, die wie eine Sammlung von Zeilen aussieht
Das x (Symlink-Nummer) wird durch die laufende Nummer in der Adressliste ersetzt.
Jetzt haben Sie eine udev-Regel, die funktioniert. Ein Symlink, der an eine USB-Hub-Adresse gebunden ist, unabhängig davon, welche Videonummer diesem Port beim Start zugewiesen wird.
Schreiben Sie die endgültige Liste in eine Datei
/etc/udev/rules.d/cam.rules
. Führenudevadm trigger
Sie den Befehl aus , um es zu aktivieren, und der Auftrag ist abgeschlossen./dev/camera2
wird die gleiche Kamera (USB-Anschluss) sein, unabhängig von seiner Videonummer.quelle
Ich konnte auch ein einzigartiges Gerät in finden
/dev/serial/by-id
. Ich habe noch keinen Neustart versucht, aber die Dateien in diesem Verzeichnis waren nur Links zur entsprechenden Gerätedatei (ttyACM[0-9]
) .`Ich verwende Arch Linux auf Raspberry Pi, aber ich bin über sie gestolpert, indem ich nur
find
nach Dateinamen gesucht habe, die "Arduino" enthalten. Meine Python-Programme funktionieren einwandfrei, wenn sie diese Dateien als Geräte zum Lesen / Schreiben von Daten auf / von meinen Arduinos verwenden (bisher zwei auf einem einzigen Pi).quelle
Um nur zu sagen, dass das oben Genannte für mich funktioniert hat und das Gerät auch für mich automatisch gemountet wurde, nachdem ich einen Eintrag in / etc / fstab vorgenommen hatte (und es ruft nach dem Entfernen des Sticks auch umount auf).
dh
/ etc / fstab
cat /etc/udev/rules.d/5-usb-stick.rules
Nachdem ich meinen USB-Stick eingesteckt habe, erhalte ich:
quelle