В последовательных коммуникациях вы почти всегда обнаружите, что сообщения данных (если не очень маленькие) разделены. В основном это связано со скоростью связи и точкой, в которой вы получаете данные из порта.
Обычно вы устанавливаете свой код для запуска в отдельном потоке (чтобы предотвратить влияние на производительность остальной части вашего кода), который вызывает событие при получении полного сообщения, а также принимает полные сообщения для передачи. Функции чтения и записи обрабатываются рабочими потоками (трафик последовательной связи медленный).
Вам понадобится буфер чтения и записи. Они должны быть достаточно большими, чтобы хранить данные за несколько циклов.
Добавить данные, прочитанные со входа, в конец буфера чтения. Пусть чтение буфера циклически включается для получения полных сообщений с самого начала буфера.
В зависимости от используемого протокола обычно начинается начало данных и, возможно, индикатор окончания данных и где-то размер сообщения (это может быть фиксированным, опять же, в зависимости от вашего протокола). Я собираю из вашего протокола, что начальный символ сообщения 'b'
, а конечный символ сообщения '*'
. Удалите все данные, предшествующие начальному символу вашего сообщения ('b'), так как это из неполного сообщения.
Когда полное сообщение будет найдено, уберите его из передней части буфера и вызовите событие, чтобы указать его прибытие.
Аналогичный процесс запускается для отправки данных, за исключением того, что вам может потребоваться разделить сообщение, следовательно, данные, которые должны быть отправлены, добавляются в конец буфера, а отправляемые данные считываются с самого начала.
Я надеюсь, что это поможет вам понять, как справиться с последовательной связью.
Как отметил Марк, вы в настоящее время очищаете свой буфер таким образом, что это вызовет проблемы.
редактировать
Как я уже сказал в своем комментарии, я не распознаю serialHC, но если вы работаете с необработанными данными, посмотрите на использование класса SerialPort
. Больше информации о том, как его использовать и пример (который примерно использует процесс, который я описал выше) можно найти здесь .