Alex_ME
@Alex_ME
Студент

Как правильно читать данные с последовательного порта?

Доброго времени суток! Столкнулся со следующей проблемой - как правильно организовать прием данных с com-порта. Имеется микроконтроллер, который шлет пакеты - заголовок (3 байта), количество данных, сами данные и в конце три нуля. На ПК принимаю эти пакеты, программа на C#. При приеме пакетов вызывается событие serialPort dataReceived, где эти данные считываются. Но проблема в том, что отправленный за раз МК пакет не обязательно придет сразу целиком. Вероятнее всего, при вызове события в буфере будет только часть пакета, окончание приходит (вместе с началом следующего пакета), при следующем вызове события. Как лучше организовать чтение данных в таком случае?
  • Вопрос задан
  • 4418 просмотров
Решения вопроса 1
@leclecovich
Вот еще один вариант "с ходу". Кладите данные в хвост очереди. Делайте итерацию с головы. Как только встречаете маркер конца пакета (три нуля, не самый удачный маркер), делаете pop части данных. После этого проверяете этот "кусок" на длину, контрольную сумму и т.д.
Кроме того, нужно помнить о том, что DataReceived будет работать в отдельном потоке.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
fart
@fart
Вариант с ходу:
в событие:  цикл читаем пока читается из порта и пишем в буфер программы
Анализ_буфера()
    если, то есть полный пакет : 
         удалить данные пакета из буфера программы или указатель двинуть на конец пакета в буфере
         используем_пакет_по_назначению
   иначе, то ничего не делаем ждем события с куском пакета
....
(ждем новое событие)


Три нуля в конце не нужны, так как у вас известен размер пакета.
Это Header=3 + 2(или 1) байта размера данных + сами данные с известным размером.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы