Как указывает Алекс Фарбер , нет гарантии, что при вызове вашего обработчика DataReceived
все байты будут там.
Если ваши буферы всегда имеют фиксированный размер и с низкой скоростью, вы можете напрямую использовать функцию Read
, а не полагаться на событие DataReceived
. Концептуально:
packetSize = 468;
...initialization...
comport.ReadTimeout = 2000; //packets expected every 1000 milliseconds, so give it some slack
while (captureFlag) {
comport.Read(rtSerBuff, 0, packetSize);
...do stuff...
}
Это можно поместить в собственный рабочий поток, если хотите.
Другой подход заключается в использовании метода ReadLine
. Вы упоминаете, что пакеты имеют известную начальную подпись. У них также есть известная конечная подпись, которая гарантированно не будет повторяться в пакете? Если это так, вы можете установить свойство NewLine
для этой конечной подписи и использовать ReadLine
. Опять же, вы можете поместить это в рабочий поток,