Ich bin ein bisschen verwirrt über das Lesen und Schreiben an eine serielle Schnittstelle. Ich habe ein USB-Gerät unter Linux, das den Konverter-Treiber für serielle FTDI-USB-Geräte verwendet. Wenn ich es anschließe, wird Folgendes erstellt: / dev / ttyUSB1.
Ich dachte, es wäre einfach, es in C zu öffnen und daraus zu lesen / schreiben. Ich kenne die Informationen zur Baudrate und Parität, aber es scheint, als gäbe es keinen Standard dafür?
Vermisse ich etwas oder kann mich jemand in die richtige Richtung weisen?
c
linux
serial-port
gnychis
quelle
quelle
ioctl
und implementiert werdenfcntl
.Antworten:
Ich habe das vor langer Zeit geschrieben ( von 1985 bis 1992, mit nur wenigen Änderungen seitdem ) und einfach die benötigten Teile kopiert und in jedes Projekt eingefügt.
Sie müssen
cfmakeraw
einen vontty
erhaltentcgetattr
. Sie können nicht Null-out einstruct termios
, konfigurieren Sie ihn, und legen Sie dastty
mittcsetattr
. Wenn Sie die Zero-Out-Methode verwenden, treten unerklärliche intermittierende Fehler auf, insbesondere bei BSDs und OS X. "Unerklärte intermittierende Fehler" umfassen das Einhängenread(3)
.Die Werte für die Geschwindigkeit sind
B115200
,B230400
,B9600
,B19200
,B38400
,B57600
,B1200
,B2400
,B4800
, usw. Die Werte für die Parität sind0
(dh keine Parität),PARENB|PARODD
(Parität ermöglichen und ungerade verwenden),PARENB
(enable Parität und verwendet sogar),PARENB|PARODD|CMSPAR
(mark Parität) undPARENB|CMSPAR
( Raumparität)."Blockieren" legt fest, ob ein
read()
am Port auf das Eintreffen der angegebenen Anzahl von Zeichen wartet. Wenn Sie keine Blockierung festlegen, wirdread()
zurückgegeben, wie viele Zeichen verfügbar sind, ohne auf weitere zu warten, bis zur Puffergrenze.Nachtrag:
CMSPAR
wird nur für die Auswahl der Markierungs- und Leerzeichenparität benötigt, was ungewöhnlich ist. Für die meisten Anwendungen kann es weggelassen werden. Meine Header-Datei/usr/include/bits/termios.h
kannCMSPAR
nur definiert werden, wenn das Präprozessorsymbol__USE_MISC
definiert ist. Diese Definition erfolgt (infeatures.h
) mitIn den einleitenden Kommentaren von
<features.h>
heißt es:quelle
lsusb
, um alle USB-Geräte anzuzeigen . Sie können unterschiedlich benannt werden, wenn Ihr System benutzerdefinierteudev
Regeln hat. siehe/etc/udev/rules.d/
Vielleicht von dort kann man den Port auswählen können Sie suchen. Sicherlich können Sie den Unterschied feststellen, indem Sie den Port auflisten und dann entfernen / anschließen.Für Demo-Code, der dem POSIX-Standard entspricht, wie im Handbuch Festlegen der Terminalmodi und der seriellen Programmierung für POSIX-Betriebssysteme beschrieben , wird Folgendes angeboten.
Es ist im Wesentlichen von der anderen Antwort abgeleitet, aber ungenaue und irreführende Kommentare wurden korrigiert.
Damit das Programm die empfangenen Daten als ASCII-Codes behandelt, kompilieren Sie das Programm mit dem Symbol DISPLAY_STRING, z
Wenn es sich bei den empfangenen Daten um ASCII-Text (und nicht um Binärdaten) handelt und Sie diese als durch das Zeilenumbruchzeichen abgeschlossene Zeilen lesen möchten, finden Sie in dieser Antwort ein Beispielprogramm.
quelle
cfmakeraw
Richtige ersetzt werden?O_NDELAY
oderO_NONBLOCK
. In cmrr.umn.edu/~strupp/serial.html wird erwähnt, dass beim Öffnen des Dateideskriptors mit diesen Flags dasVTIME
ignoriert wird. Was ist dann der Unterschied zwischen dem Ausführen mit demO_NONBLOCK
Dateideskriptor und dem Ausführen mitVTIME
?