Размер буфера приема 100 * 1024 * 1024 ОГРОМНЫЙ! Я бы серьезно сомневался, что вам нужен этот размер вообще, и, конечно, не для реального буфера последовательного порта.
Возможно, вы переполняете физический буфер приема приемника, поэтому вам может потребоваться изучить управление потоком. Это позволит вашему ресиверу сказать вашему передатчику «Подождите, перестаньте на какое-то время, позвольте мне разобраться с тем, что у меня есть».
Аппаратный контроль потока (обычно) используется через контакты RTS (Request To Send) и CTS (Clear To Send).
Посмотрите на статью this, в которой объясняется немного больше об этом.
Я лично рекомендовал оставить свойство ReceivedBytesThreshold для последовательного порта равным 1, а затем обработать событие DataReceived. Кто знает, может быть, завтра вам нужно будет прочитать сообщение размером 20 байтов или, возможно, 5 байт. Может быть, вам нужно будет читать сообщения переменной длины в будущем? Выход из порога в 1 означает, что вы можете обрабатывать все и все байты, которые будут получены, сейчас и в будущем.
Этот порог будет означать, событие будет срабатывать, когда есть по крайней мере, 1 байт в буфере. Там может быть больше и, вероятно, будет. Обратите внимание, что это NOT обязательно означает, что он будет срабатывать для каждого полученного байта.В каждом случае вам нужно проверить свойство BytesToRead и прочитать это много в своем собственном буфере.
Стоит повторить, что событие будет NOT обязательно огонь для каждого полученного байта.
Кроме того, лучше всего сделать как можно меньше в обработчике событий DataReceived. Прочитайте в любых байтах, полученных в ваш буфер, и, возможно, добавьте завершенные сообщения в очередь для дальнейшей обработки, но не делайте ничего другого.
Также обратите внимание, что стандарт максимальная спецификация в RS232 является скорость 19200 бод и длина кабеля 50 футов. Все, что выше этого, не определено. Более высокие скорости обычно требуют лучшего кабеля (более низкая емкость) и более короткой длины кабеля. Убедитесь, что он экранирован и не работает вблизи других «шумных» элементов, таких как двигатели, моторные инверторы, живые кабели и т. Д.
Что вы делаете, кроме 'ReadByte' внутри цикла while? Сколько времени занимает обработка? –
После прочтения байта из последовательного порта он будет помещен в буфер до тех пор, пока буфер не достигнет 12 байтов. как только он достигнет 12 байтов, он будет сравниваться с определенными командами, которые занимают очень мало времени. – user209293
Вы должны убедиться, что используете управление потоком, если вы еще этого не сделали. –