Виртуальный дисплей - проблема принятия данный SerialPort

MAFia
Offline
Зарегистрирован: 26.10.2011

Доброго времени суток! Решил сделать одну вещицу на ардуино, но пока дисплей (128х64) в пути, решил сделать его эмулятор на компьютере, передавая данные по Com порту. Решая эту простую задачу столкнулся с неожиданной трудностью.

Кооманды для дисплея я передаю так: 1-ый байт 0, 2-байт 0, 3-й байт длина пакета, 4-ый байт - код комманды, остальные - в зависимости от комманды.

Компьютерную часть пишу на C#. Создаю экземпляр SerialPort, добаляю ему обработчки события DataReceived. Проблема в том, что событие зачастую вызывается раньше,  чем придет пакет. Сначала несколько первых байтов, потом несколько других и так далее. Введение задержки тоже не особо улучшает ситуацию.

Бьюсь над этой проблемой и так, и сяк, но ничего адекватного так и не придумал. Как лучше организовать чтение данных? Заранее спасибо.

MAFia
Offline
Зарегистрирован: 26.10.2011

Мда, как говориться, горе от ума. Передавал комманды и данные в виде масивов байтов через Serial.write. Стоило начать передавать по-нубски текстом через println - все заработало, ничто не режится, приходит правильно. Почему такое разное поведение у строк и массиов байтов?

maksim
Offline
Зарегистрирован: 12.02.2012

Как бы вы не отправляли данные они никогда не приходят разом, они приходят последовательно. 

println отпрвляет еще два символа в конце строки \r и \nНубский споcоб как раз и отслеживает символ \n (если пользуетесь ReadLine). Вам нужно добавить байт окончания команды и по нему определять пришла команда или нет.

Хотите сказать что если отправить массив байт byte array[6] так: Serial.write(array, 6);  и отправить тот же массив как строку char array[] = "123456" так: Serial.print(array); будет разница в скорости передачи?