Обработка строк, полученных по UART

Обсуждаем контроллеры компании Atmel.
Ответить
Родился
Сообщения: 3
Зарегистрирован: Пт ноя 04, 2016 23:18:50

Сообщение good.bad »

Добрый день уважаемые!

Где-то тут встречал тему с подобным вопросом, но сейчас что-то не могу ее найти. Да и решения в ней не было, ибо обсуждение ушло в какое-то иное русло.

Стоит задача получать контроллером (Atmega8 / 32) строки по UART с последующим разбором согласно некоторым правилам. Если с посимвольным приемом все предельно ясно, то как обрабатывать строку, я что-то не соображу. Вернее соображаю, что ее нужно читать из кольцевого буфера, но что-то ничего не получается. Для работы с UART-ом использую довольно известную библиотеку от товарища Peter Fleury. Если кто не знает что это такое, то вкратце - это всего лишь пара-тройка функций по приему/передаче данных, два кольцевых буфера на прием/передачу задаваемой длины, да куча макросов для совместимости с разными моделями AVR8-контроллеров.

Если кто-то сталкивался с подобной задачей, да еще и используя выше указанную библиотеку - буду безмерно рад помощи. Если нужны будут косые примеры моих попыток реализации приема и обработки строки в коде, то выложу позже, поскольку сейчас не имею под рукой этих исходников.
Реклама
Модератор
Аватара пользователя
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля

Сообщение Аlex »

Строка в Си - это массив символов, с нулевым символом в конце. Ничего сверхъестественного.
А обработка будет зависеть от тех неких правил, которые Вы не озвучили. Да и проблему, собственно, не описали. Что конкретно не получается ?
Реклама
Родился
Сообщения: 3
Зарегистрирован: Пт ноя 04, 2016 23:18:50

Сообщение good.bad »

То, что строка в сях это массив байт с нулевым на конце - я прекрасно знаю. Ну а то, что нужно - это получить строку (a-f0-9) длиной 16 байт и распарсить в зависимости от ведущего байта. В строке содержатся различные цифро-буквенные параметры, которые в конце дополнены контрольной суммой из двух байт (как раз 15 и 16 байты). Соответственно - получаем эти 16 байт, считаем CRC от первых 14 и сравниваем с 2-мя последними. Если все благополучно - начинаем разбирать далее.

Вот такая задача. Свой код скину или сегодня ближе к ночи, или завтра. Как получится.
Друг Кота
Аватара пользователя
Сообщения: 6337
Зарегистрирован: Вт апр 24, 2007 07:45:40
Откуда: Minsk

Сообщение Jack_A »

Так в чем проблема ? Ясна задача - ясна реализация. Тем более что строка фиксированной длины. Отделить одну строку от другой ? По стартовому символу, если такой предусмотрен протоколом. По тайм-ауту. Это, пожалуй, единственный выход в случае битой посылки - пропал символ или наоборот, лишний. Если ведущий тупо молотит не глядя - хана, ничем не поможешь. А если работа (полу-) дуплексом - ведущий ожидает ответа от ведомого - тот дает сигнал: сбой, повтори передачу. Но если прога ведущего (ПК) закрытая - не позволяет влезть - посоветовать что-либо трудно.
Изображение
Реклама
Эиком - электронные компоненты и радиодетали
Родился
Сообщения: 3
Зарегистрирован: Пт ноя 04, 2016 23:18:50

Сообщение good.bad »

Проблема была в том, чтобы получить всю строку целиком. В общем, вот по этой ссылке отличный пример практически необходимой реализации. Чутку допилить и все.

Все равно спасибо за помощь. Ну а "протокол" там хитрый. И с той стороны не комп, а мозги спектрофотометра с каким-то не родным, экспериментальным блоком управления, по которому нет никакой инфы. И протокол этот был реверснут ручками.
Реклама
Друг Кота
Аватара пользователя
Сообщения: 6337
Зарегистрирован: Вт апр 24, 2007 07:45:40
Откуда: Minsk

Сообщение Jack_A »

Тогда - успехов. Получится - поделитесь с народом.
Изображение
Реклама
Вымогатель припоя
Сообщения: 541
Зарегистрирован: Вт фев 09, 2010 17:52:26

Сообщение codenamehawk »

good.bad писал(а): Если с посимвольным приемом все предельно ясно, то как обрабатывать строку, я что-то не соображу. Вернее соображаю, что ее нужно читать из кольцевого буфера, но что-то ничего не получается.
Не пойму, что тут сложного.
Проверяете, если в приемном буфере есть символ-ы, копируете в свой буфер.
Набрали 16 символов проверили контрольную сумму, если ок вывод, если ошибка отбрасываете первый символ, а в конец добавляете один из очереди и снова проверка.
Я тоже использую "Для работы с UART-ом использую довольно известную библиотеку от товарища Peter Fleury."
Мучитель микросхем
Аватара пользователя
Сообщения: 414
Зарегистрирован: Ср янв 26, 2011 13:43:30
Откуда: С того берега моря

Сообщение Jman »

ТС, посмотрите книгу В.С. Прокопенко - программирование микроконтроллеров, у него там очень подробно расписанно по UART с примерами в т.ч с приемом строк.
[color=#4080FF]- Бежит этот подлец-электрон, а вокруг его масса (аж 10 в 23й) штук ионов кремния и 10 в 15й ионов примеси и он, подлец, взаимодействует![/color]
Контактная информация:
Ответить

Вернуться в «AVR»