Как правильно читать данные с последовательного порта?
Доброго времени суток! Столкнулся со следующей проблемой - как правильно организовать прием данных с com-порта. Имеется микроконтроллер, который шлет пакеты - заголовок (3 байта), количество данных, сами данные и в конце три нуля. На ПК принимаю эти пакеты, программа на C#. При приеме пакетов вызывается событие serialPort dataReceived, где эти данные считываются. Но проблема в том, что отправленный за раз МК пакет не обязательно придет сразу целиком. Вероятнее всего, при вызове события в буфере будет только часть пакета, окончание приходит (вместе с началом следующего пакета), при следующем вызове события. Как лучше организовать чтение данных в таком случае?
Вот еще один вариант "с ходу". Кладите данные в хвост очереди. Делайте итерацию с головы. Как только встречаете маркер конца пакета (три нуля, не самый удачный маркер), делаете pop части данных. После этого проверяете этот "кусок" на длину, контрольную сумму и т.д.
Кроме того, нужно помнить о том, что DataReceived будет работать в отдельном потоке.
К примеру, 0xFEFE - начало, 0xFFFF - конец. Если какие-то данные содержат 0xFF или 0xFE в теле пакета, то они отдельно кодируются добавлением символа, например (0xFF -> 0xFF00).
в событие: цикл читаем пока читается из порта и пишем в буфер программы
Анализ_буфера()
если, то есть полный пакет :
удалить данные пакета из буфера программы или указатель двинуть на конец пакета в буфере
используем_пакет_по_назначению
иначе, то ничего не делаем ждем события с куском пакета
....
(ждем новое событие)
Три нуля в конце не нужны, так как у вас известен размер пакета.
Это Header=3 + 2(или 1) байта размера данных + сами данные с известным размером.