Виртуальный дисплей - проблема принятия данный SerialPort
- Войдите на сайт для отправки комментариев
Доброго времени суток! Решил сделать одну вещицу на ардуино, но пока дисплей (128х64) в пути, решил сделать его эмулятор на компьютере, передавая данные по Com порту. Решая эту простую задачу столкнулся с неожиданной трудностью.
Кооманды для дисплея я передаю так: 1-ый байт 0, 2-байт 0, 3-й байт длина пакета, 4-ый байт - код комманды, остальные - в зависимости от комманды.
Компьютерную часть пишу на C#. Создаю экземпляр SerialPort, добаляю ему обработчки события DataReceived. Проблема в том, что событие зачастую вызывается раньше, чем придет пакет. Сначала несколько первых байтов, потом несколько других и так далее. Введение задержки тоже не особо улучшает ситуацию.
Бьюсь над этой проблемой и так, и сяк, но ничего адекватного так и не придумал. Как лучше организовать чтение данных? Заранее спасибо.
Мда, как говориться, горе от ума. Передавал комманды и данные в виде масивов байтов через Serial.write. Стоило начать передавать по-нубски текстом через println - все заработало, ничто не режится, приходит правильно. Почему такое разное поведение у строк и массиов байтов?
Как бы вы не отправляли данные они никогда не приходят разом, они приходят последовательно.
println отпрвляет еще два символа в конце строки \r и \n. Нубский споcоб как раз и отслеживает символ \n (если пользуетесь ReadLine). Вам нужно добавить байт окончания команды и по нему определять пришла команда или нет.
Хотите сказать что если отправить массив байт byte array[6] так: Serial.write(array, 6); и отправить тот же массив как строку char array[] = "123456" так: Serial.print(array); будет разница в скорости передачи?