Ich kann der Antwort von Hans nicht viel hinzufügen, außer zu sagen, dass eine der größten Fallen, die ich gesehen habe, darin besteht, dass die Leute dazu neigen, zu erwarten, dass alle Bytes, die sie empfangen möchten, vorhanden sind, wenn das Ereignis DataReceived ausgelöst wird.
Wenn Ihr Nachrichtenprotokoll z. B. 20 Bytes lang ist, wird das Ereignis DataReceived ausgelöst und Sie versuchen, 20 Bytes zu lesen. Vielleicht sind sie alle da, vielleicht auch nicht. Es ist ziemlich wahrscheinlich, dass sie nicht da sind, je nach Baudrate.
Sie müssen die Eigenschaft BytesToRead des Anschlusses, von dem Sie lesen, überprüfen und diese Menge in Ihren Puffer lesen. Wenn mehr Bytes verfügbar sind, wird das Ereignis "DataReceived" erneut ausgelöst.
Beachten Sie, dass das Ereignis DataReceived ausgelöst wird, wenn die Anzahl der zu empfangenden Bytes mindestens der Eigenschaft ReceivedBytesThreshold des seriellen Anschlusses entspricht. Standardmäßig ist dieser Wert wohl auf 1 gesetzt.
Wenn Sie diesen Wert z. B. auf 10 setzen, wird das Ereignis ausgelöst, wenn 10 oder mehr Bytes auf den Empfang warten, aber nicht weniger. Dies kann zu Problemen führen oder auch nicht, und ich persönlich bevorzuge es, diesen Eigenschaftswert auf 1 gesetzt zu lassen, so dass alle empfangenen Daten das Ereignis auslösen, auch wenn nur 1 Byte empfangen wird.
Machen Sie nicht den Fehler, dass dies dazu führt, dass das Ereignis für jedes einzelne empfangene Byte ausgelöst wird - das ist nicht der Fall.