Re: read() in C

From: Oliver Gerlich <olig9_at_gmx.de>
Date: Fri, 26 Mar 2010 22:38:20 +0100

Am Freitag, den 26.03.2010, 19:39 +0100 schrieb Claudia Neumann:
> Hallo Liste!
>
> Bin leider kein ausgewiesener C-Experte, muss aber in C programmieren, um auf
> die Kartenlesegeräte zugreifen zu können.
>
> Problem:
> ein read() hat normalerweise die Länge von 3 Bytes, wenn allerdings ein Fehler
> auftritt werden 4 Bytes zurückgegeben.
>
> Wie kann ich den read-Befehl absetzen, damit sowohl 3 Bytes als auch 4 Bytes
> auf einmal gelesen werden:
>
> unsigned char frage[4];
> memset( frage, 0x00, sizeof(frage));
> retval=read(port,frage,sizeof(frage));
>
> geht nicht: hängt bei einer 3-Bytes-Antwort.

> Wenn ich
> unsigned char frage[3];
> setze, kommt die Fehlermeldung mit 4 Bytes nicht vollständig an und ich muss
> nochmal ein weiteres read() mit 1 Byte nachholen.
>
> Gibt's da eine andere Möglichkeit?

Eine Möglichkeit wäre wohl, den seriellen Port (?) im "non-blocking
mode" zu lesen; dann sollte read() nicht hängen, sondern liest nur
soviel wie verfügbar (oder maximal die angeforderten 4 Bytes).
Das sollte mit fcntl() und dem O_NONBLOCK-Flag gehen, wie etwa hier
beschrieben:
http://unix.derkeiler.com/Newsgroups/comp.unix.solaris/2006-03/msg00071.html
(das Beispiel ist zwar für Sockets, aber sollte wohl auch für serielle
Ports und andere Dateien gehen).

Google hat für "O_NONBLOCK fcntl example" auch noch das hier gefunden:
http://tldp.org/HOWTO/Serial-Programming-HOWTO/x115.html

Grüße,
Oliver
Received on Fri Mar 26 2010 - 22:38:20 CET

This archive was generated by hypermail 2.2.0 : Fri Mar 26 2010 - 22:38:34 CET