0 / 0 / 0
Регистрация: 29.01.2010
Сообщений: 68
|
|
1 | |
Прием данных с UART29.05.2011, 15:35. Показов 6284. Ответов 4
Метки нет (Все метки)
Вопрос скорее архитектурного плана.
МК принимает по UART пакеты данных. Протокол бинарный. Формат следующий: OC|ADR|CMD|N|DATA OCh - метка начала пакета. ADR - адрес девайса CMD - код команды N - кол-во байт в поле DATA Все поля - по одному байту, поле DATA - переменной длины (задается полем N) и может отсутствовать. Динные принимаются по прерыванию от UART и складируются в буфер с увеличением счетчика Процедура, которая разбирает принятый пакет запускается по таймеру. Она проверяет счетчик принятых данных и, если пришло как минимум 3 байта - анализирует его и выполняет нужные действия. Все работает, если пакеты (посылаю с терминалки) приходят "честные" - то есть как положено. Но, если передать неполный пакет (например, с отсутствующими полями N и DATA, которые требуются для данной команды), то на следующий, правильный пакет МК не реагирует. Вопрос - как отличить ситуацию, что нам намеренно пихнули неполный пакет от ситуации "пакет еще не дополз по UART" ?
0
|
29.05.2011, 15:35 | |
Ответы с готовыми решениями:
4
Прием данных на пк с UART, ATMEGA16 Приём данных по UART Atmega8 Корректный прием данных из UART на Delphi Некорректный прием данных по UART интерфейсу на ATMega128 Прием и передача данных через UART интерфейс. Atmega32A |
0 / 0 / 0
Регистрация: 28.09.2010
Сообщений: 4,283
|
|
29.05.2011, 15:42 | 2 |
1) По интервалу между пакетами. Если продолжение пришло с опозданием, то оно уже другой пакет.
2) Подобрать команды (и данные) так, чтобы N != 0Ch. Тогда можно будет однозначно определить, новый это пакет или продолжение старого. 3) Использовать разные настройки (стоп биты, длина кадра, скорость ect) для сигнатуры и остальных данных. Тогда можно применить флаг Frame Error для определения ВНЕЗАПНОГО появления нового пакета.
0
|
0 / 0 / 0
Регистрация: 23.01.2010
Сообщений: 111
|
|
29.05.2011, 16:02 | 3 |
Если извесно количесво байт в пакете (N+4), то непонятно, почему не проще запустить программу обработки по окончанию приема а не мучать таймер лишнимы проверками? Это ж, если пришло 3 байта а должно прийти еще 5, то таймер замучается ж проверять :)
Но тогда надо установить, что, к примеру, если в течении определенного периода времени следующий байт пакета не пришел - то его отбрасываем, счетчик байт обнуляем. Маякуем, что произошла ошибка, ждем повторения посылки, если надо. В этом случае не обязательно добиваться N != 0Ch (в друг в поле DATA 12 байт?). Заголовок будет заголовком при счетчике байт равном 0. ИМХО, если протокол редактируемый, поле N лучше расположить сразу после заголовка. Раньше узнаем, сколько байт ждать.
0
|
0 / 0 / 0
Регистрация: 28.11.2010
Сообщений: 65
|
|
30.05.2011, 23:50 | 4 |
Если правильно понял фразу
Лечение по моему простое - возложить установку начального адреса буфера на таймер, который обрабатывает защитный интервал.
0
|
0 / 0 / 0
Регистрация: 08.05.2010
Сообщений: 332
|
|
31.05.2011, 01:15 | 5 |
[QUOTE="Mitior"]Если правильно понял фразу [QUOTE="Цитата:[/QUOTE]
Лечение по моему простое - возложить установку начального адреса буфера на таймер, который обрабатывает защитный интервал. А почему бы не применить стандартный протокол типа ISIS-II? Добавить выход по таймауту и никаких проблем!
0
|
31.05.2011, 01:15 | |
31.05.2011, 01:15 | |
Помогаю со студенческими работами здесь
5
Прием строки по uart UART прием и расшифровка строки прием байта с UART ATtiny2313 ATMEGA16 - прием по UART в буфер числа от 0 до 255 Ассемблер Прием данных по UART с прерыванями Прием данных по UART на STM32F0 Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |