Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры ATmega AVR
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.71/34: Рейтинг темы: голосов - 34, средняя оценка - 4.71
0 / 0 / 0
Регистрация: 29.01.2010
Сообщений: 68
1

Прием данных с UART

29.05.2011, 15:35. Показов 6284. Ответов 4
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Вопрос скорее архитектурного плана.
МК принимает по UART пакеты данных. Протокол бинарный. Формат следующий:
OC|ADR|CMD|N|DATA
OCh - метка начала пакета.
ADR - адрес девайса
CMD - код команды
N - кол-во байт в поле DATA
Все поля - по одному байту, поле DATA - переменной длины (задается полем N) и может отсутствовать.
Динные принимаются по прерыванию от UART и складируются в буфер с увеличением счетчика
Процедура, которая разбирает принятый пакет запускается по таймеру.
Она проверяет счетчик принятых данных и, если пришло как минимум 3 байта - анализирует его и выполняет нужные действия.
Все работает, если пакеты (посылаю с терминалки) приходят "честные" - то есть как положено.
Но, если передать неполный пакет (например, с отсутствующими полями N и DATA, которые требуются для данной команды), то на следующий, правильный пакет МК не реагирует.
Вопрос - как отличить ситуацию, что нам намеренно пихнули неполный пакет от ситуации "пакет еще не дополз по UART" ?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
29.05.2011, 15:35
Ответы с готовыми решениями:

Прием данных на пк с UART, ATMEGA16
Здравствуйте, не работает прием данных на пк, они не выводятся в TEXTBOX. Отправка с самого МК...

Приём данных по UART Atmega8
Доброго времени суток! Продолжаю постигать азы микроконтроллеров. В прошлой теме задавал, как уже...

Корректный прием данных из UART на Delphi
Здравствуйте, с контроллера (ATmega16) через USB-UART в порт посылаю числа (1, 2, 3...), с помощью...

Некорректный прием данных по UART интерфейсу на ATMega128
Контроллер: ATMega 128 Пишу в Visual Studio 2005 Создаю диалоговое MFC приложение Суть...

Прием и передача данных через UART интерфейс. Atmega32A
Итак, написал очень простой код для МК мега32. #define F_CPU 12000000UL #define BAUDRATE 9600 ...

4
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
Если правильно понял фразу
Динные принимаются по прерыванию от UART и складируются в буфер с увеличением счетчика
то указание начала буфера возложено на счетчик - переполнился и тогда ставится адрес. Если это так то при неполном предыдущем приеме, данные начнут помещаться не в начало буфера, а с некоторого адреса.
Лечение по моему простое - возложить установку начального адреса буфера на таймер, который обрабатывает защитный интервал.
0
0 / 0 / 0
Регистрация: 08.05.2010
Сообщений: 332
31.05.2011, 01:15 5
[QUOTE="Mitior"]Если правильно понял фразу [QUOTE="Цитата:[/QUOTE]
Динные принимаются по прерыванию от UART и складируются в буфер с увеличением счетчика
то указание начала буфера возложено на счетчик - переполнился и тогда ставится адрес. Если это так то при неполном предыдущем приеме, данные начнут помещаться не в начало буфера, а с некоторого адреса.
Лечение по моему простое - возложить установку начального адреса буфера на таймер, который обрабатывает защитный интервал.
А почему бы не применить стандартный протокол типа ISIS-II?
Добавить выход по таймауту и никаких проблем!
0
31.05.2011, 01:15
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
31.05.2011, 01:15
Помогаю со студенческими работами здесь

Прием строки по uart
Добрый день всем. Хочу реализовать прием строки из терминала по UART, но что-то не выходит. Прошу...

UART прием и расшифровка строки
Всем доброго времени суток :) есть идея "сурьезного масштаба", а именно работа с переменными на...

прием байта с UART ATtiny2313
Делаю вот что: #define F_CPU 8000000UL #include <avr/io.h> #define baud 51 // параметр...

ATMEGA16 - прием по UART в буфер числа от 0 до 255 Ассемблер
Добрый день! Не могу понять, подскажите пожалуйста куда копать. Необходимо принимать по UART...

Прием данных по UART с прерыванями
Всем привет! У меня проблема пи работе с UART. Если отправить данные в терминал получается...

Прием данных по UART на STM32F0
Здравствуйте. При попытке принять пачку байтов читаю только 1 байт, в прерывание повторно заходит,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru