Ich muss feststellen, ob ein serielles USB-Gerät an mein Embedded-System angeschlossen oder nicht angeschlossen ist, und weiß, was das ist tty
mit ihr verbundenen.
Mein System läuft über einen 2.6-Linux-Kernel.
Da ich keinen Schreibzugriff habe udev
Regeln, heute versuche ich, diese Informationen aus dem Dateisystem zu bekommen, und suche nach Änderungen in /sys/bus/usb/devices
Verzeichnis. Ich habe jedoch einige Probleme mit diesem Ansatz.
Ich weiß was das ist Id BUS
des angeschlossenen USB-Ports (z. B. 1-1.3). Also suche ich nach dem zugehörigen tty
(Suche nach einem Verzeichnis in /sys/bus/usb/devices/<Id BUS>:1.0/tty/
- z.B. /sys/bus/usb/devices/1-1.3:1.0/tty/ttyACM0
). Auf diese Weise weiß ich, dass ich verwenden sollte /dev/ttyACM0
um mit meinem Gerät zu kommunizieren. Aber manchmal ist dieses Gerät (/dev/ttyACM0
) ist nicht vorhanden.
Gibt es einen besseren Weg, um diese Informationen zu erhalten?
Ich habe sogar gedacht, diese Informationen aus dem Syslog zu bekommen, aber ich weiß nicht, ob das eine gute Idee ist.
Bearbeiten:
Nur um das zu klären, muss mein System in der Lage sein, Zustandsänderungen im USB-Bus zu erkennen, d tty
mit dem Namen verbunden) oder ein vorhandener ist nicht angeschlossen.
Das System überwacht bis N
USB / serielle Geräte, die über das Gerät angeschlossen werdenein USB-HUB Während seiner normalen Ausführung können neue Geräte angeschlossen, vorhandene Geräte entfernt (oder durch einen Remote-Befehl aus diesem Bereich neu gestartet werden). Wenn ein Gerät neu gestartet wird, kann es ein anderes Gerät empfangen tty
von der vorherigen, die zuvor verwendet wurde (z. ttyACM0
-> ttyACM3
), da der Kernel dazu a tty
Das ist im Moment kostenlos und es ist ein großes Problem für mich.
Antworten:
0 für die Antwort № 1Ich schrieb eine USB-Abstraktionsbibliothek namens libusbp. Du solltest es betrachten port_name beispielzeigt, wie Sie mit libusbp den Namen der seriellen Schnittstelle erhalten (z. /dev/ttyACM0
) für ein serielles USB-Gerät. Hinter den Kulissen erhält libusbp diese Informationen mithilfe von libudev.
0 für die Antwort № 2
Prüfen Sie, ob die virtuelle Datei mit stat gelöscht wird.
#include <sys/statvfs.h>
...
struct stat sb;
return (stat("/dev/ttyUSB0", &sb) == 0); // true if open, false otherwise
0 für die Antwort № 3
Netlink ist der bevorzugte Mechanismus für die Kommunikation zwischen Kernel und Userspace.
Sie würden einen Netlink-Socket mit der Familie erstellen NETLINK_KOBJECT_UEVENT
, hören Sie sich diesen Socket an und filtern Sie Nachrichten, die SUBSYSTEM=usb
und ACTION=add
für USB-Plug-Events oder ACTION=remove
für USB-Unplug-Ereignisse.