Я ничего не могу добавить к ответу Ганса, кроме как сказать, что одна из самых больших ловушек, которую я видел, состоит в том, что люди склонны ожидать, что когда произойдет событие DataReceived, все байты, которые они хотели бы получить, все присутствующие.
например. если ваш протокол сообщений имеет длину 20 байтов, событие DataReceived срабатывает, и вы пытаетесь прочитать 20 байтов. Они все могут быть там, они не могут. Довольно вероятно, что их не будет, в зависимости от скорости вашего бод.
Вам необходимо проверить свойство BytesToRead порта, который вы читаете, и прочитать эту сумму в своем буфере. Если и когда доступно больше байтов, событие DataReceived снова запустится.
Обратите внимание, что событие DataReceived будет срабатывать, когда количество принимаемых байтов будет по меньшей мере равнозначению свойства ReceivedBytesThreshold для последовательного порта. По умолчанию я полагаю, что это значение равно 1.
Если вы установите это значение 10, например, событие будет срабатывать, когда 10 или более байтов ждут приема, но не меньше. Это может или не может вызвать проблемы, и я предпочитаю оставить это значение свойства равным 1, так что все полученные данные будут запускать событие, даже если получено только 1 байт.
Не ошибитесь, что это вызовет событие для каждого получаемого байта - это не будет сделано.