реклама на сайте
подробности

 
 
> UART STM32F100Rxx и определение окончание приема "пакета" данных
alexdos
сообщение Mar 12 2013, 08:14
Сообщение #1


Местный
***

Группа: Участник
Сообщений: 339
Регистрация: 10-07-08
Из: Херсон
Пользователь №: 38 856



По какому признаку можно определить что "пакет" данных в буфер по прерыванию принят. Данные идут от GPS приёмника, их количество не фиксировано. Тоесть может быть к примеру 146 байт, а может быть 152 байта.
Пробую через (USART_GetITStatus(USART2,USART_IT_IDLE) != RESET), но неверно определяет окончание приёма, данные не приняты все, а мне уже симафорит что принято.
Или по старинке, использовать таймер для определения окончания приёма?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
uriy
сообщение Mar 12 2013, 08:39
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 429
Регистрация: 30-11-05
Из: Ижевск
Пользователь №: 11 606



Цитата
Тоесть может быть к примеру 146 байт, а может быть 152 байта.
Откуда контроллеру знать сколько байт в вашем пакете?
NMEA пакеты заканчиваются символом переноса строки, что вам мешает использовать этот признак?
Go to the top of the page
 
+Quote Post
alexdos
сообщение Mar 12 2013, 09:36
Сообщение #3


Местный
***

Группа: Участник
Сообщений: 339
Регистрация: 10-07-08
Из: Херсон
Пользователь №: 38 856



"NMEA пакеты заканчиваются символом переноса строки, что вам мешает использовать этот признак?" все верно, но мне нужно принять весь пакет данных отправляемый GPS приемником. Включающий в себя группу пакетов NMEA, каждый с которых оканчивается символом переноса строки. Вырезать каждый NMEA пакет я не хочу, хочу получить всю пачку, при этом потратив минимум ресурсов, а затем спокойно обработать.
KnightIgor Вы бы по сути сказали, а не высказывали предположения о моих познаниях. Чтото типа "так не делают" , а вот так делают. По приходу каждого байта по прерыванию (USART_GetITStatus(USART2,USART_IT_RXNE) != RESET) я этот байт складываю в буфер. Вот и спрашиваю в опытных, какой признак окончания приёма данных (пауза) будет достаточным, чтоб считать что приём данных окончен. Ежели нет достаточного аппаратного признака, тогда буду использовать таймер, который будет следить за наличием достаточной паузы неактивности работы UART после прихода последнего байта, что и будет означать о окончании передачи GPS пакета данных.
Go to the top of the page
 
+Quote Post
KnightIgor
сообщение Mar 12 2013, 13:12
Сообщение #4


Знающий
****

Группа: Участник
Сообщений: 643
Регистрация: 29-05-09
Из: Германия
Пользователь №: 49 725



Цитата(alexdos @ Mar 12 2013, 10:36) *
KnightIgor Вы бы по сути сказали, а не высказывали предположения о моих познаниях.

NMEA пакеты представляют собой "читабельные" строки, начинающиеся, как уже отвечали, c $ и заканчивающиеся символами возврата каретки и перевода строки. То есть, "классика" ASCII терминалов эры больших компьютеров 70-х - 80-х годов. GPS модуль, выдающий NMEA пакеты, выдает такие строки разного(!) содержания (различные токены) довольно интенсивно: если посмотреть на терминал, ну просто сплошным потоком! Полагаться на какие-либо паузы между пакетами не приходится: даже если они и есть, они могут быть нерегулярны или вариироваться от производителя к производителю. Вывод - разделять пакеты на основе пауз есть совершенно ненадежное дело, об этом нужно забыть.

Представьте себе три процесса: первый процесс "толкается" прерыванием от приема байта от USART и тупо записывает принятый байт в буфер FIFO.

Второй процесс выбирает побайтно из этого FIFO и тупо складывает ОТОБРАЖАЕМЫЕ символы (то есть, только те, что не меньше 0х20) в еще один линейный буфер (строку) друг за другом, пока не наткнется на символ \n. Если это произошло, процесс дополняет содержимое линейной строки конечным нулем (ASCIIZ) и передает ее копию вышестоящему процессу №3 для синтаксического разбора, а сам начинает нанизывание строки сначала.

Третий процесс получает на вход фактически строку NMEA, которую он должен разчленить на данные с помощью, например, sscanf(). Если принятая строка содержит разумные данные (см. форматы различных сообщений и контрольную сумму), процесс выполняет требуемые действия.

GPS модул выплевывает много разных токенов, содержимое которых может пересекаться. Некторые токены могут быть вообще не нужны. Например, меня интересовали в проекте только время и координаты. Я выбрал токен $GPRMC, а остальные заглушил, то есть передал в GPS модуль управляющие команды фильтрации. Кроме того, я уменьшил частоту передачи сообщений с 0.25с до 1с, т.к. мне чаще не нужно, а процессор разгружается.

Вам код дать?

Сообщение отредактировал KnightIgor - Mar 12 2013, 13:21
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- alexdos   UART STM32F100Rxx и определение окончание приема "пакета" данных   Mar 12 2013, 08:14
- - KnightIgor   Цитата(alexdos @ Mar 12 2013, 09:14) По к...   Mar 12 2013, 08:50
- - drum1987   вы когда байт складываете в буфер попутно проверяй...   Mar 12 2013, 09:48
|- - alexdos   Цитата(drum1987 @ Mar 12 2013, 12:48) вы ...   Mar 12 2013, 10:06
|- - mempfis_   Цитата(alexdos @ Mar 12 2013, 13:06) Я уж...   Mar 12 2013, 10:26
|- - Сергей Борщ   QUOTE (alexdos @ Mar 12 2013, 12:06) Я уж...   Mar 12 2013, 10:44
|- - alexdos   Сергей Борщ , спасибо за понятный ответ. Теперь...   Mar 12 2013, 13:49
|- - Сергей Борщ   QUOTE (alexdos @ Mar 12 2013, 15:49) Тепе...   Mar 12 2013, 14:05
|- - KnightIgor   Цитата(alexdos @ Mar 12 2013, 14:49) знаю...   Mar 12 2013, 14:07
- - Golikov A.   Думаю все тянется со старого пика, который работае...   Mar 12 2013, 16:57
|- - alexdos   Цитата(Golikov A. @ Mar 12 2013, 20:57) П...   Mar 12 2013, 17:38
- - richie   А это зависит от самих данных, соглашения об их ор...   Mar 12 2013, 18:10
|- - alexdos   Цитата(richie @ Mar 12 2013, 22:10) P.S. ...   Mar 12 2013, 18:31
|- - richie   Цитата(alexdos @ Mar 12 2013, 22:31) СRC ...   Mar 14 2013, 05:35
|- - demiurg_spb   разговор ни о чём...   Mar 14 2013, 05:48
|- - Golikov A.   Цитата(richie @ Mar 14 2013, 09:35) P.S. ...   Mar 14 2013, 06:05
|- - alexdos   Наверное я не так изначально поставил вопрос. Но т...   Mar 14 2013, 08:38
- - Golikov A.   можно делать выводы что вы их не нашли. Я больше ...   Mar 12 2013, 19:55
|- - DmitryM   Цитата(Golikov A. @ Mar 12 2013, 23:55) м...   Mar 13 2013, 04:35
- - Golikov A.   но только потому что на каждое сообщение должен бы...   Mar 13 2013, 14:57
|- - DmitryM   Цитата(Golikov A. @ Mar 13 2013, 18:57) н...   Mar 13 2013, 15:48
- - Golikov A.   в этом и фишка, что если устройство ответит то мож...   Mar 13 2013, 16:56
|- - alexdos   Цитата(Golikov A. @ Mar 13 2013, 20:56) П...   Mar 13 2013, 20:29
|- - _Артём_   Цитата(alexdos @ Mar 13 2013, 22:29) Да г...   Mar 13 2013, 21:11
- - vlad_new   ЦитатаСпециального механизма отслеживания пауз в U...   Mar 13 2013, 17:02
- - Golikov A.   Не тут что-то не так. Любой протокол на базе УАРТ...   Mar 14 2013, 03:27
- - Golikov A.   Ну хотелось бы разделить лавры с другими участника...   Mar 14 2013, 15:28
|- - alexdos   Цитата(Golikov A. @ Mar 14 2013, 19:28) Н...   Mar 14 2013, 18:48
- - Golikov A.   весьма познавательно, спасибо. Надо будет где нибу...   Mar 14 2013, 18:57


Reply to this topicStart new topic
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 20th June 2025 - 08:49
Рейтинг@Mail.ru


Страница сгенерированна за 0.01429 секунд с 7
ELECTRONIX ©2004-2016