Was ist der richtige Weg, um eine Liste aller verfügbaren seriellen Ports / Geräte auf einem Linux-System zu erhalten?
Mit anderen Worten, wenn ich über alle Geräte in iteriere /dev/
, wie kann ich dann feststellen, welche auf klassische Weise serielle Ports sind, dh solche, die normalerweise Baudraten und RTS / CTS- Flusskontrolle unterstützen?
Die Lösung würde in C codiert.
Ich frage, weil ich eine Bibliothek eines Drittanbieters verwende, die dies eindeutig falsch macht: Sie scheint nur zu iterieren /dev/ttyS*
. Das Problem ist, dass es beispielsweise serielle Anschlüsse über USB gibt (bereitgestellt von USB-RS232-Adaptern), die unter / dev / ttyUSB * aufgeführt sind. Wenn ich das Serial-HOWTO auf Linux.org lese , komme ich auf die Idee, dass es mit der Zeit auch andere Namensräume geben wird.
Ich muss also den offiziellen Weg finden, um serielle Geräte zu erkennen. Das Problem ist, dass keine dokumentiert zu sein scheint oder ich sie nicht finden kann.
Ich kann mir vorstellen, dass eine Möglichkeit darin besteht, alle Dateien zu öffnen /dev/tty*
und eine bestimmte Datei aufzurufen ioctl()
, die nur auf seriellen Geräten verfügbar ist. Wäre das aber eine gute Lösung?
Aktualisieren
hrickards schlug vor, in der Quelle nach "setserial" zu suchen. Sein Code macht genau das, was ich mir vorgestellt habe:
Zunächst wird ein Gerät geöffnet mit:
fd = open (path, O_RDWR | O_NONBLOCK)
Dann ruft es auf:
ioctl (fd, TIOCGSERIAL, &serinfo)
Wenn dieser Aufruf keinen Fehler zurückgibt, handelt es sich anscheinend um ein serielles Gerät.
Ich habe ähnlichen Code in Serial Programming / termios gefunden , der vorschlug, auch die O_NOCTTY
Option hinzuzufügen .
Bei diesem Ansatz gibt es jedoch ein Problem:
Als ich diesen Code unter BSD Unix (dh Mac OS X) getestet habe, hat er auch funktioniert. jedoch seriellen Geräten, die über Bluetooth bereitgestellt werden, versucht das System (der Treiber) jedoch, eine Verbindung zum Bluetooth-Gerät herzustellen. Es dauert eine Weile, bis ein Timeout-Fehler auftritt. Dies wird durch einfaches Öffnen des Geräts verursacht. Und ich kann mir vorstellen, dass ähnliche Dinge auch unter Linux passieren können - im Idealfall sollte ich das Gerät nicht öffnen müssen, um seinen Typ herauszufinden. Ich frage mich, ob es auch eine Möglichkeit gibt, ioctl
Funktionen ohne Öffnen aufzurufen oder ein Gerät so zu öffnen, dass keine Verbindungen hergestellt werden.
Was soll ich machen?