SerialPort.Read -> SerialPort.ReadTimeout greift nicht bei mehr als einem Byte im Puffer

17/12/2007 - 13:03 von Rudi | Report spam
Hallo Leute,

kann mir bitte jemand bestàtigen, warum folgender Code nicht so làuft
(wie ich mir das erwartet hàtte) und kennt jemand die Hintergründe warum
das so implementiert wurde?

Erklàrung gibt es zwar in der MSDN, macht für mich aber keinen Sinn,
wenn ich das ReadTimeout doch gesetzt habe.

"Da die SerialPort-Klasse Daten puffert, der in der
BaseStream-Eigenschaft enthaltene Stream jedoch nicht, gibt es
möglicherweise Konflikte dahingehend, wie viele Bytes gelesen werden
können. [..]"

ReceivedBytesThreshold auch probiert, hat in diesem Szenario (ohne
Events) nichts gebracht.

8<--
//[..]
SerialPort.Write(byteArray, 0, byteArray.Length);
SerialPort.ReadTimeout = 1000;
int BytesToRead = sio.BytesToRead; // klar null, wenn noch nichts
empfangen wurde

byte[] rcv = new byte[sio.ReadByte()]; // read length variable
int BytesToRead2 = sio.BytesToRead; // test only
rcv[0] = (byte)rcv.Length;
int BytesToRead3 = sio.Read(rcv, 1, rcv.Length - 1);
8<--

Hier ist das Problem, die Daten wurden gelesen, sind aber noch nicht
alle im Puffer zum Auslesen bereit. Hier sollte das ReadTimeout greifen,
tut es aber nicht. Das macht doch keinen Sinn, oder doch?

Also bleibt nur das SerialPort.ReadByte() mit Schleife.

Es sollte doch ein globales ReadTimeout geben und ein "Intermediate
character timeout", also die Zeit die zwischen den einzelnen Zeichen
vergehen darf bis es zu einem Timeout kommt.

Jedenfalls sollte das Read () erst zurückkehren nachdem das eingestellte
ReadTimeout vergangen ist bzw. wenn alle angeforderten Zeichen gelesen
wurden innerhalb vom Timeout.

Mir geht es darum zu wissen ob das wirklich so implementiert wurde und
ob jemand weiß warum. Vielen Dank!

Gruß, Rudi
 

Lesen sie die antworten

#1 Andre Stille
19/12/2007 - 11:18 | Warnen spam
Hallo!

"Rudi" schrieb im Newsbeitrag
news:
Hallo Leute,

kann mir bitte jemand bestàtigen, warum folgender Code nicht so làuft (wie
ich mir das erwartet hàtte) und kennt jemand die Hintergründe warum das so
implementiert wurde?



ReadTimeout setzt in der COMMTIMEOUTS-Struktur ReadTotalTimeoutConstants
auf den übergebenen Wert, ReadIntervalTimeout und ReadTotalTimeoutMultiplier
auf MAXDWORD.

In der Doku kann nachgelesen werden, was diese Kombination an Werten für
Auswirkungen auf das Auslesen hat.

MfG
Andre Stille

Ähnliche fragen