|
38 / 31 / 9
Регистрация: 29.03.2019
Сообщений: 345
|
|||||||||||
Разбор NMEA сообщений26.06.2019, 13:14. Показов 12666. Ответов 34
Товарищи, подскажите, что не так делаю.
Решил распарсить данные с GPS приемника. Принимаю с помощью USART на скорости 9600. Проблема в том что данные обновляются с периодичностью 2-10 секунд. Надеялся, что хотябы 1 сек. будет. Нашел такой код.
0
|
|||||||||||
| 26.06.2019, 13:14 | |
|
Ответы с готовыми решениями:
34
проблема с принятием NMEA сообщений
парсер NMEA |
|
874 / 535 / 175
Регистрация: 30.07.2015
Сообщений: 1,739
|
|
| 27.06.2019, 11:51 | |
|
Ethereal, да можно и так. Я так тоже делал, правда мне нужна была одна конкретная строка. А GPS отсылает пачку из 5-6 этих строк каждая из которых начинается с $ и заканчивается переводом строки. Между ними нет времени на разбор ибо они идут потоком.
Либо можно после принятия одной строки копировать ее в другой буффер и там парсить, а в это время набивать основной буффер.
1
|
|
|
38 / 31 / 9
Регистрация: 29.03.2019
Сообщений: 345
|
|
| 27.06.2019, 12:03 [ТС] | |
|
0
|
|
|
912 / 672 / 134
Регистрация: 01.03.2010
Сообщений: 1,279
|
||
| 27.06.2019, 12:03 | ||
|
[quote="northcitizen;13684993"]Это для модуля Sim800L такой таймаут выбран?[/quo
1
|
||
|
6773 / 2741 / 385
Регистрация: 17.02.2013
Сообщений: 4,048
|
||||
| 27.06.2019, 17:12 | ||||
Вернее тайм-аут желателен, но не для того чтобы определять конец пакета. После обработки принятого байта посылки счетчик времени делаем t=0 и далее инкрементируем его в моменты тика некоего таймера. Если t переполяется, а очередной байт все еще не пришел, то связь вообще пропала и идем на пункт 1. Если очередной байт пришел в момент когда t неприлично большой, то верить посылке тоже нельзя, в ней была большая пауза, а значит возможно мы приняли начало одной посылки, потом на время потеряли связь и теперь принимаем хвост другой. Тогда если пришел $ начинаем пункт 2 с начала, а если не $, то идем на пункт 1. Вполне строгий на проверки и весьма простой алгоритм. Добавлено через 12 минут
Добавлено через 5 минут
1
|
||||
|
874 / 535 / 175
Регистрация: 30.07.2015
Сообщений: 1,739
|
||
| 27.06.2019, 17:16 | ||
|
Ethereal,
0
|
||
|
6773 / 2741 / 385
Регистрация: 17.02.2013
Сообщений: 4,048
|
|
| 27.06.2019, 17:26 | |
|
Подумал и согласился, что если несколько строк непрерывным потоком, то тайм-аут как определение конца пачки строк хорошо. Ну а если делаем так. Имеем два буфера по 80 байт. Сначала принимаем в один, на лету порубая поток символов на строки тем алгоритмом, что я предложил. Как пришел перевод строки проверяем три байта в заголовке. Если это нужная нам строка, то переключаемся на прием во второй буфер (переставляем указатель). И вот наконец когда тайм-аут который говорит нам о том, что пачка строк закончилась, в первом буфере на лету вырезанная нужная нам строка.
0
|
|
|
0 / 0 / 0
Регистрация: 07.05.2020
Сообщений: 7
|
|
| 07.05.2020, 13:43 | |
|
Здравствуйте, я начинающий. Подскажите, пожалуйста где и как необходимо описать структуру GPSFixData
Спасибо!
0
|
|
|
38 / 31 / 9
Регистрация: 29.03.2019
Сообщений: 345
|
||||||
| 07.05.2020, 19:08 [ТС] | ||||||
|
Almaz72,
0
|
||||||
|
0 / 0 / 0
Регистрация: 07.05.2020
Сообщений: 7
|
|
| 08.05.2020, 09:43 | |
|
Спасибо большое! Только я все равно не могу понять, почему структура называется GPGGA_Struct, а обращение к ней в программе идет по названию GPSFixData. И компилятор (Keil) ругается). Извините, еще раз, если задаю глупые вопросы, до этого писал только на Ассемблере. Попробовал поменять GPGGA_Struct на GPSFixData, компилятор все равно ругается)
0
|
|
|
38 / 31 / 9
Регистрация: 29.03.2019
Сообщений: 345
|
|||||||||||
| 08.05.2020, 10:53 [ТС] | |||||||||||
|
Almaz72, потому что struct GPGGA_Struct это тип, вам нужно создать GPSFixData типа GPGGA_Struct.
P.S. Так же как и для создания переменной а типа int вы пишите
0
|
|||||||||||
|
0 / 0 / 0
Регистрация: 07.05.2020
Сообщений: 7
|
|
| 08.05.2020, 14:02 | |
|
спасибо огромное!
0
|
|
|
42 / 35 / 11
Регистрация: 22.09.2017
Сообщений: 125
|
||||||
| 08.05.2020, 18:08 | ||||||
|
Ненужные сообщения можно отключить.
В ublox это делается посылкой в GPS модуль таких команд:
0
|
||||||
|
0 / 0 / 0
Регистрация: 07.05.2020
Сообщений: 7
|
||||||
| 13.05.2020, 13:22 | ||||||
|
Здравствуйте! Всем спасибо за ответы!
Появился еще один вопрос: На Stm32f030 хотел сделать так: один раз в 10(время настраиваемое) устройство просыпается. считывает время с gnss модуля(mc60), это время записывается в RTC, далее устанавливается время будильника + 20 сек(например), включается прерывания от RTC и устройство уходит в спящий режим(HAl_Pwr_enterStanbyMode()). При загрузке программы или первом включении работает правильно - пробуждается через 10 сек. Затем начинается что то непонятное для меня - оно начинает просыпаться каждую секунду. В rtc.c установку времени, даты , параметров, будильника убрал. Попробую вставить код, если получится) Как писал выше . до этого работал только на ассемблере и больше всего с AVR и MCS51, прошу , сильно не ругайте В терминале - первое сообщение - нормальное, через 10 секунд, остальные через секунду или две( в программе задержка была)
0
|
||||||
|
0 / 0 / 0
Регистрация: 07.05.2020
Сообщений: 7
|
|
| 16.05.2020, 10:38 | |
|
Добрый день! Вообщем, разобрался, может кому-то поможет-
надо было сбросить флаг _ HAL_PWR_CLEAR_FLAG(PWR_FLAG_WU) до бесконечного цикла while(1)
0
|
|
|
Модератор
8982 / 6749 / 921
Регистрация: 14.02.2011
Сообщений: 23,875
|
|
| 16.05.2020, 10:56 | |
|
1
|
|
| 16.05.2020, 10:56 | |
|
nmea over ethetnet Перевод координат NMEA Отправка nmea на сервер
$GPVTG протокола NMEA в GPS Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Часы электронные
Uhbif79 12.08.2026
Выкладываю программу часов. Программа позволяет:
1. Использовать системное время и дату,
2. Есть возможность вводить время и дату вручную.
3. Реализованы 2 будильника: начало и конец рабочего дня. . . .
|
Часы с будильником на основе класса QLCDNumber
Uhbif79 12.08.2026
Всем добрый день, выкладываю программу часов с будильником на основе класса QLCDNumber.
Здесь я пробовал самостоятельно создавал классы, впервые столкнулся с видимостью переменной одного класса из. . .
|
Установка MinGW GCC 16.2 и CMake
8Observer8 10.08.2026
VK Видео:
https:/ / vkvideo. ru/ video-240781534_456239017
YouTube:
eY5-5PyI9NM
Текстовая версия
|
Неделя из жизни имитационной модели склада: мои кривые руки растут, откуда надо
anaschu 10.08.2026
Неделя из жизни имитационной модели склада: как я почти написал неправильную логику и что с этим делать
Работаю сейчас над учебно-рабочим проектом: строю в AnyLogic имитационную модель процессов. . .
|
|
Калькулятор для расчета родства
russiannick 07.08.2026
1. Задача: Создать калькулятор для расчета родства.
Родственных связей существует 8 ступеней, такие как:
p - отец
P - мать
q - муж
Q - жена
b - брат
B - сестра
s - сын
S - дочь
|
Мир по моей воле
kumehtar 07.08.2026
Когда-то кажется, что всё просто. Ты весь такой светлый. Причиняешь добро. Борешься за справедливость в этом тёмном мире.
Потом начинаешь замечать одну неприятную вещь. Почти каждый хороший. . .
|
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С.
Задача:
Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
|
У нас сейчас поговорку "Опять 25" нужно переделать на "Опять +35".
kumehtar 04.08.2026
С ностальгией вспоминаю времена моего детства, когда у нас и правда +25 - была максимальная температура летом. Раньше +25 °C реально казались вершиной жары, когда можно было весь день пропадать на. . .
|