Re: read() in C

From: Claudia Neumann <dr.claudia.neumann_at_gmx.de>
Date: Fri, 26 Mar 2010 23:19:17 +0100

Hallo Oliver!

Am Freitag März 26 2010 schrieb Oliver Gerlich:
> 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.htm
>l (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

Habe die Schnittstelle schon mit dem O_NONBLOCK-Flag geöffnet. Beim read muss
trotzdem ausdrücklich die Länge angegeben werden. Sonst hängt es.

Viele Grüße

Claudia Neumann
Received on Fri Mar 26 2010 - 23:19:17 CET

This archive was generated by hypermail 2.2.0 : Fri Mar 26 2010 - 23:39:55 CET