Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: stm32 + ublox UC530M
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
VadimNic_nt
Здравствуйте форумчане!

Может кто-нибудь поделиться ссылкой на библиотеку для работы с навигационным модулем ublox UC530M, заточенную для работы с stm32f103xx?
Написал собственный модуль, но столкнулся с тем, что иногда не проходит инициализация этих модулей ожидаемым образом и перестает работать парсинг
NMEA сообщений.
KnightIgor
Цитата(VadimNic_nt @ Oct 24 2014, 17:28) *
Может кто-нибудь поделиться ссылкой на библиотеку для работы с навигационным модулем ublox UC530M, заточенную для работы с stm32f103xx?
Написал собственный модуль, но столкнулся с тем, что иногда не проходит инициализация этих модулей ожидаемым образом и перестает работать парсинг
NMEA сообщений.

Мне кажется, такой библиотеки нет. Каждый пишет сам под себя. Возможно, следует лучше порыться в собственном коде и раскопать, что же не работает.

У меня есть некоторое устройство на STM32F103, к которому подключен модуль Navilock NL-552ETTL. Через UART, естественно. Он также выдает NMEA сообщения, которые анализируются в итоге с помощью sscanf(). Все написано мной. Код сильно завязан на мою рабочую библиотеку, поэтому он вряд ли сможет быть перенесен в ваш проект. Однако некоторые идеи я могу привести.

1. USART принимает по прерыванию и складывает все в быстрый буфер FIFO.
2. Некий синхронный процесс выбирает байты из FIFO и формирует строки; признак конца строки - <LF>.
3. Как только этот процесс собрал цельную строку воедино, он вызывает функцию, которая вычленяет параметры NMEA функцией sscanf() с правильно сформированной строкой формата. Конкретно меня интересует токен $GPRMC:

#define NMEA_GPRMC_FORMAT_STRING "$GPRMC,%f,%c,%f,%c,%f,%c,%*f,%*f,%d"

Из него я беру координаты и дату со временем. Это, собственно, и все.
VadimNic_nt
В моей задаче все гораздо проще. Необходимо только получать с навигационного модуля информацию о времени, соответственно анализировать сообщение типа $GPZDA - Date & Time. У модуля UC530M есть возможность отключить все сообщения кроме $GPZDA. Так я и сделал. Получился алгоритм с использованием прерывания и DMA c минимальным вмешательством в работу со стороны процессора. Но... в некоторых случаях UC530M продолжает выдавать "левые" сообщения (т.е. инициализация проходит не корректно) и мой алгоритм "падает". В документации на UC530M рекомендаций по инициализации практически нет. Поэтому я и интересуюсь этим вопросом...
x893
а чем nmealib не подходит, или TinyGPS ?
дп и свой парсер пишется максимум за день
VadimNic_nt
Цитата(x893 @ Oct 26 2014, 21:38) *
а чем nmealib не подходит, или TinyGPS ?
дп и свой парсер пишется максимум за день

Мой вопрос скорее по начальной инициализации модулей чем по парсеру.
Было собрано несколько десятков устройств, но в некоторых модуль инициализируется как-будто не с первого раза.
В документации производителя этот вопрос практически не освещен....
x893
я несколько раз отправлял команды если ответа не пришло. Один раз было мало - терялись команды (или ответы)
VadimNic_nt
Цитата(x893 @ Oct 28 2014, 20:19) *
я несколько раз отправлял команды если ответа не пришло. Один раз было мало - терялись команды (или ответы)

Видимо доставка команд иногда не проходит и для гарантии выполнения команды необходимо обязательно проверять ответ модуля...
alexdos
Даже можно ничего не настраивать, главное чтоб скорость совпадала.
Принимаем строку, признак конца <LF>.
Строку копируем в буфер парсера.
Взводим флаг наличия текста в буфере парсера.
Проверяем заголовок, если не $GPRMC , игнор, в противном случае роскладываем данные ориентируясь по запятым. Всё.
Да, нужно наличие двух буферов.

Вариант второй.
Кольцевой буфер, принимаем данные, признак опять же <LF>, но проверка и разбор данных уже своими функциями, а не стандартными текстовыми.

Хотите универсальности, не уповайте на количество знаков между запятыми, к примеру в одних модулях может коордната быть 4250.55897 а в других 4250.5589. Ну и с курсом, высотой скоростью, те же яйца.
В общем задача на один вечер.

Если данные берутся с разных NMEA, нужно также учитывать что в разных модулей их последовательность может быть разной. И чтоб не получились данные от разных "точек" это тоже нужно учитывать.

Попадаются модули которые к примеру вместо $GPRMC могут слать $GNRMC, в одной партии так, в другой этак.

Попадаются модули с разными начальными настройками под заказчика (скорость uart к примеру).
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.