парсинг NMEA
- Войдите на сайт для отправки комментариев
Сб, 13/10/2018 - 17:51
Здравствуйте, подскажите, как мне из определенной строки вытащить необходимые мне данные. Есть два сообщения, $GPGGA и $GPRMC, мне нужно из сообщения GPGGA вытащить седьмое число после запятой,т.е кол-во спутников, а из сообщения GPRMC вытащить скорость, что является тоже седьмым числом после запятой.Как распознать тип сообщения я вроде как сообразил.Вот код.
#include <SoftwareSerial.h> SoftwareSerial mySerial(4, 3); // RX, TX char st = '0'; char b; boolean renew = false; void setup() { Serial.begin(9600); mySerial.begin(9600); } void loop() { char b = mySerial.read(); switch ( st ) // перебираем состояния { case '0': if('$' == b) st = '1'; break; case '1': if('G' == b) st = '2'; else st = '0'; break; case '2': if('P' == b) st = '3'; else st = '0'; break; case '3': if('G' == b) st = '4'; else st = '0'; break; case '4': if('G' == b) st = '5'; else st = '0'; break; case '5': if('A' == b) st = '6'; else st = '0'; break; case '6': if(',' == b) { // распознали $GPGGA st = '0'; } breake; }
Не знаю правильно так или нет, но работает. А вот дальше загвоздка, как теперь посчитать семь запятых в этих сообщениях?
не мучайтесь
https://github.com/ericbarch/arduino-libraries/blob/master/NMEA/nmea.h
а на каких скоростях работает библиотека? На 9600 слишком медленно, пробовал пделать на библиотеке TINYGPS+, очень медленно информация поступает из ардуины. Мне надо чтобы она принимала с GPS по UART на скорости 57600(5 раз в секунду), а эта библиотека работает на 9600.
она не работает с портом, данные вы читаете сами, она только парсит строку на составляющие.
скорость зависит от приемника, некоторые умеют перенастаиваться.
для приёмника BU-353 GLONASS, ND105C
Команда изменения частоты на 10 ГЦ (десять раз в секунду): $PMTK220,100*2F
Команда изменения частоты на 5 ГЦ (пять раз в секунду): $PMTK220,200*2C
Максимальная частота фиксации координат для данного GPS-чипсета 10 ГЦ.
ясно, спасибо за наводку. Только я не очень понимаю как ею пользоваться. Это же не библиотека, просто скопировать код и вставить в пой скетч, а дальше выбрать необходимые мне параметры для расшифровки?
как включать читайте тут на форуме, мне лень расписывать все это, да хоть что-то вы должны сделать :)
пример про скорость там-же https://github.com/ericbarch/arduino-libraries/blob/master/NMEA/examples/gprmc_speed/gprmc_speed.pde
Не пойму как этим добром пользоваться.Тупо скопировал все, потом ниже ставлю свой код.
При компиляции выдает ошибку _gprmc_utc was not declareted in this scope.
Мда... Три года на форуме и до сих пор не научились пользоваться гитхабом и подключать библиотеки.
http://arduino.ru/forum/obshchii/kak-postich-nepostizhimoe#comment-388080
Ну библиотеку подключить не сложно если она в ZIP архиве, а в таком виде я даже и не знаю как ее задействовать.
Жесть - это такая холоднокатаная листовая сталь с защитным покрытием, сделаная по ГОСТ Р 52204-2004
Ну библиотеку подключить не сложно если она в ZIP архиве, а в таком виде я даже и не знаю как ее задействовать.
зачем тебе библиотека ??? я тебе нормальную ссылку дал, там человек все разжевал уже дальше некуда...
так, разобрался, выводит то что надо. Но тут выводится информация только из сообщения GPRMC, а мне надо еще кол-во спутников, которое зашифровано в сообщении GPGGA. Как быть?)
так, разобрался, выводит то что надо. Но тут выводится информация только из сообщения GPRMC, а мне надо еще кол-во спутников, которое зашифровано в сообщении GPGGA. Как быть?)
даже НЕ смешно ...
не ну правда, я не спец по работе с GPS,можно извлечь как то кол-во спутников? Оно зашифровано в GPGGA.
не ну ты прикалываешься что-ли? я тоже не спец, по второй ссылке в гугле находится
да это я згаю, как мне применив вот это https://github.com/ericbarch/arduino-libraries/tree/master/NMEA получить кол-во спутников. Как я понял эта библиотека расшифровывает только строку GPRMC, или я не прав?
да это я згаю, как мне применив вот это https://github.com/ericbarch/arduino-libraries/tree/master/NMEA получить кол-во спутников. Как я понял эта библиотека расшифровывает только строку GPRMC, или я не прав?
тоесть ту ссылку, что я дал ты упорно читать не хочешь...
да... это именно сталь с защитным покрытием :(
«Жесть» — дебютный фильм петербургского кинорежиссёра Дениса Нейманда 2006 года по сценарию Константина Мурзенко в жанре психологического триллера.
Вот это ближе к теме и ближе к триллеру
Нет тут кол-ва спутников.
И все умники замолчали.
И все умники замолчали.
А, хренли тебе писать когда ты сам с собой болтаешь ...
тебе сюда
http://arduino.ru/forumy/ishchu-ispolnitelya
Как быть?)
Купить хороший аудиопровод из безкислородной меди, и повеситься на нём нахрен от такой жизни.
ИЧСХ, тема называется "парсинг NMEA". А внутри - поиск быдлотек(тм) чужими руками :)
Полазив по форуму, нашел код, переделал неиного, все работает, но слишком медленно, частота обновления информации 1сек, а мне надо выводить 5 раз в секунду. Код такой.
Запуская вот этот код, информация выводится как положено, каждые 200мс.
Я так понимаю, первый код слишком тяжелый, задача всего то вывести 2 параметра из двух строк от GPS приемника.Может кто что подскажет по оптимизации? Пробовал библиотеку NMEA, она глючит с моим OLED дисплеем, как только прописываю строки #include <nmea.h> и NMEA gps(GPRMC) дисплей не запускается. Поэтому прихожу к тому, что строки эти надо вручную обрабатывать, проверить пришла ли нужная строка и вытаскивать необходимое значение, причем число типа int.
и что - неужели при такой вот передаче параметров последующий принт печатает ненулевые значения num_sat, time и speed? - не верю
может вы ошиблись при выкладывании скетча в конфу? - не должно это работать
Нет не ошибся, передает каждые 200мс. Не знаю как картинку приложить.
Это уже оцинкованая жесть !!!
Полазив по форуму, нашел код, переделал неиного, все работает, но слишком медленно, частота обновления информации 1сек, а мне надо выводить 5 раз в секунду. Код такой.
********
== Какой нафиг "полазив по форуму" ? Эту ссылку я тебе тут два дня назад дал !
пост#8
Запуская вот этот код, информация выводится как положено, каждые 200мс.
Я так понимаю, первый код слишком тяжелый, задача всего то вывести 2 параметра из двух строк от GPS приемника.Может кто что подскажет по оптимизации?
=== Все нормально работает скетч !!!
Когда себя прооптимизируешь, то может поймешь, что модуль отдает информацию с частотй 1 Гц, а если нужно быстрее, то нужно перепрограммировать сам модуль !
пост#3
но жесть крепка и не пробиваема ...
нашел код, переделал неиного, все работает
Так, ну я не буду комментировать как Вы его
изуродовалипеределали, только "работает" он у Вас "как повезёт". Повезёт - найдёт строку, не повезёт - пропустит. Нормально сработает только в том случае, если $GPGGA будет чётной строкой, а $GPRMC - нечётной. Если чётность не такая - она пропустит соответсвующие строки.и что - неужели при такой вот передаче параметров последующий принт печатает ненулевые значения num_sat, time и speed?
Там же ссылки.
Модуль я перепрошил на частоту 5Гц, он работает, данные на этой частоте приходят как и положено, в мониторе порта это хорошо видно.
Модуль я перепрошил на частоту 5Гц, он работает, данные на этой частоте приходят как и положено, в мониторе порта это хорошо видно.
пост #32 прочитай, посмотри как идут строки, подумай, прими решение .
(поменяй очередность запросов в лупе)
(поменяй очередность запросов в лупе)
Ох, напрасно Вы так! Он ведь посчитает, что это должно решить проблему и ... в общем, нехорошо о Вас подумает :)
и что - неужели при такой вот передаче параметров последующий принт печатает ненулевые значения num_sat, time и speed?
Там же ссылки.
Чувствую. что мне надо это повторить... Чета казалось, что если параметр функции - ссылка, то и передавать надо ссылки, а не переменные
Вы правы, выводится 2 раза кол-во спутников, поэтому и не работает на нужной частоте 5Гц. Но что можно предпринять для выхода из этой ситуации?
(поменяй очередность запросов в лупе)
Ох, напрасно Вы так! Он ведь посчитает, что это должно решить проблему и ... в общем, нехорошо о Вас подумает :)
тогда я расстроюсь и сделаю себе харакири :-))
но похоже он это так и не попробывал сделать... тупо долбится с двойным выводом спутников ...
а то убралсябы один лишний вывод спутников, глядишь и с частотой наладилось ... пока наладилось бы ...
Вы правы, выводится 2 раза кол-во спутников, поэтому и не работает на нужной частоте 5Гц. Но что можно предпринять для выхода из этой ситуации?
например искать $GPRMC и $GPGGA в одной и той же функции. В начале функции проверяем, с чего начинается строка - и в зависимости от результата извлекаем либо то, либо другое. Заодно и дублирования своего жуткого кода с поиском запятых избавитесь
Вы имеете ввиду поменять порядок строк с переменными int speed,int num_sat и double time ?
Не злитесь, ну не спец я в этом парсинге, понимаю как должно быть, а реализовать не могу.
gzp13 - при ответе либо начинайте ответ с имени собеседника, либо цитируйте часть сообщения, на которое отвечаете.
Никто особо и не злится, а ответ на твой вопрос "что делать" см. в посте #24. Там всё написано.
Хорошо, идею я понял. Как мне в данном коде реализовать проверку приходящтх строк в одной функции .
Я правильно записал строку 76?
Время и кол-во спутников извлекаем из строки &GPGGA. Это получилось. Теперь ине надо извлечь дату из строки GPRMC.
А вот как организовать проверку, что пришла строка &GPRMC? Я так понимаю нельзя в функцию bool readLatLon добавить условие проверки
Предполагаю, что встречаются одинаковые названия функций.
что мешает сделать вот так:
Спасибо Вам b707, направили на нужную мысль, получилось то что я хотел. Всем большое спасибо за помощь.
так, возникла еще проблемка. Скорость с GPS поступает в узлах в час, знаю что для перевода в км/час надо скорость умножить на 1.852, т.е запись будет speed=atof(comma+1)*1.852
Но мой GPS занижает скорость на 4км/час, т.е мне надо прибавить еще 4км/час.Но тогда при нулевой скорости у меня на дисплее будет индицироваться 4км/час. Думаю что коррекцию скорости надо сделать после 30км/час, посмотрите код.Коррекция начинается со строки 173-184. Но при этих строках искажаются все данные на выходе(((
$GPVTG, x.x, T x.x, M x.x, N x.x, K *hh <CR><LF>
1. Направление курса в градусах, T
2. Магнитное склонение в градусах, М
3. Скорость над поверхностью (SOG) в узлах, N = узлы
4. Скорость над поверхностью (SOG) в км/ч, К = км/ч
5. hh Контрольная сумма строки (обязательно)
Пример сообщения:
$GPVTG,217.5,T,208.8,M,000.00,N,000.01,K*4C
Но мой GPS занижает скорость на 4км/час, т.е мне надо прибавить еще 4км/час.
чем измерено ?
не спидометром автомобиля часом ?
Именно им) Даже если и спидометр автомобиля завышает, все равно хотелось бы привести и ту и эту скорость к одной величине.