Lesen/schreiben in einem Gerät in C++
Wie kann ich lese - /Schreibzugriff auf ein Gerät, das in C++? das Gerät ist in /dev/ttyPA1
.
Ich dachte über fstream sind, aber ich kann nicht wissen, ob das Gerät die Ausgabe, die ich Lesen kann, ohne zu blockieren die Anwendung.
Mein Ziel ist die Schaffung und Anwendung, wo Sie schreiben etwas in die Klemme, und es wird gesendet in /dev/ttyPA1
. Hat das Gerät etwas zu schreiben wieder liest er es aus dem Gerät und schreiben Sie auf den Bildschirm. Wenn nicht, wird es geben dem Benutzer die Eingabeaufforderung zu schreiben, um das Gerät wieder ein.
Wie kann ich dies tun?
Welche Art von Gerät ist das? Sollte Sie vielleicht mit
Seine ein-PWM-controller, wenn seine Bedeutung
open()
und Freunde?Seine ein-PWM-controller, wenn seine Bedeutung
InformationsquelleAutor Dani | 2011-06-29
Du musst angemeldet sein, um einen Kommentar abzugeben.
Verwenden
open(2)
,read(2)
, undschreiben(2)
zum Lesen aus und schreiben in das Gerät (und vergessen Sie nicht,close(2)
, wenn Sie fertig sind). Sie können auch verwenden Sie die C-stdio-Funktionen (fopen(3)
und Freunde) oder die C++ - Klassen fstream sind, aber wenn Sie das tun, werden Sie fast sicher wollen die Pufferung deaktivieren (setvbuf(3)
für stdio, oderoutFile.rdbuf()->pubsetbuf(0, 0)
für fstreams).Diese arbeiten alle im Sperrung - Modus, jedoch. Sie können
select(2)
, um zu testen, ob es möglich ist, zum Lesen aus oder schreiben in eine Datei-Deskriptor, ohne zu blockieren (wenn es nicht möglich ist, sollte man nicht tun). Alternativ können Sie öffnen Sie die Datei mit derO_NONBLOCK
flag (oder verwenden Siefcntl(2)
, um die Flagge nach dem öffnen) auf den file-Deskriptor zu machen, non-blocking; dann, jeder Aufruf zurread(2)
oderwrite(2)
blockieren würden, statt nicht sofort mit der FehlermeldungEWOULDBLOCK
.Beispiel:
InformationsquelleAutor Adam Rosenfield
Können Sie
fstream
, aber du gehst zu haben, um sich die Spezifikationen, wie Sie Ihr Gerät möchten, um Daten zu empfangen. Einige Geräte werden nur in Ordnung, mithilfe von ASCII-Daten, andere Geräte benötigen einen bestimmten binäre Sequenz von Daten-bits/bytes. Sie können auch schreiben, die benutzerdefinierte Serialisierung von Objekten, die überlastung deroperator<<
undoperator>>
Funktionen für die Daten, die Sie versuchen zu schreiben. Entweder das, oder Sie konnte dieread()
undwrite()
Methoden zum Lesen/schreiben von binären Rohdaten vom/zum Puffer-arrays, die Sie haben zugewiesen in deinem Programm.Bearbeiten: wenn Sie sind besorgt über die Blockierung Verhalten, dann haben Sie zwei Möglichkeiten. So müssen Sie entweder verwenden die POSIX-API, und überprüfen Sie Ihre geöffneten Datei-Deskriptor, die entweder mit
poll()
oderselect()
um zu sehen, ob Daten zur Verfügung stehen oder Sie müssen halten Sie eine Datei-Lesen oder schreiben-Aufrufe in eine Reihe von separaten threads, die im Grunde handeln, wie zum asynchronen Lesen/schreiben Aktionen. So würden Sie im Grunde senden Sie eine Nachricht an den reader/writer-thread und diesem thread blockieren würde, wenn nötig auf diefstream
ruft, doch der rest des Programms könnte weiterhin funktionieren. Ihr Programm, obwohl kann nicht entworfen werden, denn threads, und wenn das der Fall ist, wird die POSIX-API wäre der einzige Weg zu gehen.Gut, Sie könnte verwenden
fstream::read()
um wieder die bytes, und laden Sie Sie in einem intern zugewiesenen Puffer übergeben wird ... im Grunde die gleiche Methode, die Sie verwenden würden, in C mitread()
und einen Datei-Deskriptor zugewiesen mitopen()
. Sonst könnten Sie einige Objekt, die es verwaltet den internen Speicher Puffern, und die überlastung deroperator>>
- Funktion arbeiten mit benutzerdefinierten reader-Objekt.das problem ist, dass es blockiert, wenn es nichts zu Lesen, ich muss nicht Lesen, wenn es nichts zu Lesen.
InformationsquelleAutor Jason