|
UART STM32F100Rxx и определение окончание приема "пакета" данных |
|
|
|
 |
Ответов
|
Mar 12 2013, 09:36
|
Местный
  
Группа: Участник
Сообщений: 339
Регистрация: 10-07-08
Из: Херсон
Пользователь №: 38 856

|
"NMEA пакеты заканчиваются символом переноса строки, что вам мешает использовать этот признак?" все верно, но мне нужно принять весь пакет данных отправляемый GPS приемником. Включающий в себя группу пакетов NMEA, каждый с которых оканчивается символом переноса строки. Вырезать каждый NMEA пакет я не хочу, хочу получить всю пачку, при этом потратив минимум ресурсов, а затем спокойно обработать. KnightIgor Вы бы по сути сказали, а не высказывали предположения о моих познаниях. Чтото типа "так не делают" , а вот так делают. По приходу каждого байта по прерыванию (USART_GetITStatus(USART2,USART_IT_RXNE) != RESET) я этот байт складываю в буфер. Вот и спрашиваю в опытных, какой признак окончания приёма данных (пауза) будет достаточным, чтоб считать что приём данных окончен. Ежели нет достаточного аппаратного признака, тогда буду использовать таймер, который будет следить за наличием достаточной паузы неактивности работы UART после прихода последнего байта, что и будет означать о окончании передачи GPS пакета данных.
|
|
|
|
|
Mar 12 2013, 13:12
|
Знающий
   
Группа: Участник
Сообщений: 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
|
|
|
|
Сообщений в этой теме
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
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|