/ / C ++ Erkennung eines seriellen USB-Geräts, das angeschlossen / nicht angeschlossen ist - Linux, Embedded, USB, Hotplugging

C ++ USB-Seriell-Gerät erkannt - Linux, Embedded, USB, Hotplugging

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 № 1

Ich 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.