Die SerialPort-Klasse hat intern eine eigene Schleife, über die sie via
WaitCommEvent auf Ereignisse/Daten wartet und löst dann u.a.
DataReceived über einen ThreadPool aus.
Zumindest früher konnte es passieren, dass die SerialPort-Klasse z.B. 2
direkt hintereinander DataReceived auslöst, beim ersten wären z.B. 10
Bytes verfügbar, beim zweiten 30 Bytes.
Liest man im ersten nun maximal 300 Bytes aus, kann man dort ggf. direkt
40 Bytes einlesen, dann wird im zweiten DataReceived .Read() erstmal
hängen, weil es auf neue Daten wartet.
Ich meine mit .ReadExisting oder .Read mit .BytesToRead konnte das man
da Probleme verhindern.
(Kann das aber auch völlig im Kopf haben - Ich habe lange nichts mit der
SerialPort-Klasse gemacht)
Mit eigenem Thread/BackgroundWorker und Verzicht auf Nutzung von
DataReceived hatte ich nie Probleme.