Beim Lesen des gerade geöffneten SerialPort wird nur ein Byte gelesen

Seltsames Problem.

Wenn ich von com-port mit leseSerialPort.Read(), dann, wenn Daten ankommen,Beim ersten Aufruf wird nur ein Byte gelesenMissachtung voncount Parameter und Anzahl der verfügbaren Bytes innerhalb des Timeouts. Alle weiteren Ablesungen sind in Ordnung, nur hat das allererste Problem

VerwendenSerialPort.DiscardInBuffer() oder close / open (reopen) com-port wirdnochmal verursachen das Problem der ersten Lesung.

Hier ist ein Code:

var port = new SerialPort();
port.PortName = "com2";
port.BaudRate = 9600;
port.WriteTimeout = 1000;
port.ReadTimeout = 1000;
port.Open();

// ... send some data first

var read = new byte[10];
if (port.Read(read, 0, read.Length) != read.Length)
{
    // always here at first reading no matter what
}

// ... send some data again

if (port.Read(read, 0, read.Length) != read.Length)
{
    // not here anymore (unless error)
}

Problem wird nicht angezeigt, wenn die angegebene Datenmenge bereits zum Lesen verfügbar istRead() wird genannt.

Eine Erklärung.

Read() ist synchrones Lesen. Es wird zurückgegeben, wenn die angegebene Datenmenge empfangen wurde oder das Zeitlimit abgelaufen ist. Wie es aussieht,TimeoutException wird nur geworfen, wenn null Bytes empfangen werden. Wenn das Zeitlimit abgelaufen ist, bevor die angeforderte Datenmenge gelesen wurde, gibt die Funktion die Anzahl der gelesenen Bytes zurück. Daher muss der Rückgabewert mit dem angeforderten Wert verglichen werden, um festzustellen, ob das Lesen in Ordnung war.

Aber der erste Anruf hat ein Problem:

Wenn während der Zeitüberschreitung 0 Bytes eingegangen sind, wartet der erste Aufruf ordnungsgemäß auf die Zeitüberschreitung und löst die TimeoutException aus. Wenn mindestens 1 Byte eingetroffen ist, wird die Funktion sofort beendet, wobei das Timeout ignoriert und die Anzahl der insgesamt zu lesenden Bytes angefordert wird.

So sehe ich es. Liege ich falsch? Was soll ich machen?

Noch ein paar Tests. EinfügenThread.Sleep() um sicherzustellen, dass wennRead() aufgerufen wird, werden alle Daten verfügbar sein, wird das Problem verschwinden lassen.

Lassen Sie uns logischerweise den Ruhezustand nur für den ersten Anruf hinzufügen. Yay. Was???? Das Problem tritt nun mit aufzweiter Anruf undnur zweiter anruf. Mit anderen Worten, es tritt ein Problem mit dem aufLesen Sie zuerst (), was nicht alle Daten zur Verfügung haben wird, sondern nur einmal.

Antworten auf die Frage(3)

Ihre Antwort auf die Frage