Парсинг NMEA
- Войдите на сайт для отправки комментариев
Доброго дня.
Хочу научиться "парсить" NMEA сигналы, т.е. разбивать, собирать, изменять строки, например полученные от GPS модуля.
Взять например такую строку: $GPRMC,214603.000,A,4634.54557,N,03047.50473,E,0.00,0.00,040617,,,A*6E
На данном этапе хочу научиться выбирать символы находящиеся между запятыми и записывать их в отдельные массивы или перемененные, наверное массивы будет правильно.
Пример результата, который хочу получить:
a0[]=$GPRMC; a1[]=214603.000; a2[]=A; a3[]=4634.54557; a4[]=N; a5[]=03047.50473; и так до конца.
В голове алгоритм следующего плана: Берём строку, пока не будет конца строки, то будет выполняться следующее условие. Читаем строку посимвольно, пока не найдём запятую. Если символ равен запятой, то записываем его в счётчик count. Например, счётчик равен 2, то начиная со следующего символа, посимвольно записываем каждый символ в массив, до тех пор, пока не наткнёмся на запятую.
Готового решения не надо, сразу запинывать тоже не надо, лучше небольшими пенделями пинать в нужном направлении)
Готового решения не надо, сразу запинывать тоже не надо, лучше небольшими пенделями пинать в нужном направлении)
Правда хотите? Я могу попробовать, но сколько бы раз не пробовал раньше, всегда кончалось одним и тем же - ТС делал вывод, что ему не надо уметь работать со строкой, а нужно распарсить конкретный пример.
Подтвердите, что готовы потратить на это неделю-две, тогда начнём
Готового решения не надо, сразу запинывать тоже не надо, лучше небольшими пенделями пинать в нужном направлении)
Правда хотите? Я могу попробовать, но сколько бы раз не пробовал раньше, всегда кончалось одним и тем же - ТС делал вывод, что ему не надо уметь работать со строкой, а нужно распарсить конкретный пример.
Подтвердите, что готовы потратить на это неделю-две, тогда начнём
привет карантинщикам!)
чтобы научить ТС работать со строками в Си, его надо заставить посидеть в отладчике где в одном окне листинг дизассемблера выполняемый пошагово а в другом отображается память и её изменение после каждого шага отладчика)
другого пути увы НЕТ!)
а вообще научится в IDE Arduino писать на Си это гиблое дело... ни отладчика хоть какого то (я уж не говорю про нормальный) ни дизассемблера)
я уж не говорю про то как отладить какие то сложные функции без отладчика...
я уж не говорю ...
Вот ни не говорите. Зачем говорить-то начали? :-)
Правда хотите? Я могу попробовать, но сколько бы раз не пробовал раньше, всегда кончалось одним и тем же - ТС делал вывод, что ему не надо уметь работать со строкой, а нужно распарсить конкретный пример.
Евгений, у меня есть ссылка на одно такое Ваше обьяснение, могу выложить. чтоб вам заново не распинатся перед очередным неучем :)
Правда хотите? Я могу попробовать, но сколько бы раз не пробовал раньше, всегда кончалось одним и тем же - ТС делал вывод, что ему не надо уметь работать со строкой, а нужно распарсить конкретный пример.
Подтвердите, что готовы потратить на это неделю-две, тогда начнём
Если я правильно понял, что ПАРСИНГ NMEA сигналов - это значит разбивать, собирать, изменять, добавлять свои данные в строки, например полученные от GPS модуля, то я готов.
Тем более с нынешней ситуацией, появилось много свободного времени, которое по возможности, надо использовать с пользой)
Сразу говорю, что в этом деле туговат, но очень интересно, с примерами разбираться могу не один день, и задавать много вопросов, поэтому ЕвгенийП, тут скорее вопрос к вам, вы готовы, если да, то поехали)
ЕвгенийП, если вам удобно, могу общаться и получать примеры и задания, на почту или в любом мессенджере, а не на форуме.
Вот ни не говорите. Зачем говорить-то начали? :-)
открыл глаза новичку что нихрена путевого из обучения Си в Arduino IDE не выйдет)
новичок должен пуд соли съесть, копаясь в отладчике и дизассемблерном листинге чтобы понять как работает Си)
NAYGER - хотел вам дать ссылку на предыдущую подобную тему - но с удивлением обнаружил. что вы ее читали и даже в ней отметились.
Это такой троллинг - открыть новую ветку на ту же тему и прикинутся новичком. который впервые слышит слово "парсинг"? Чем вас та тема с ее примерами кода не устраивает?
открыл глаза новичку
Напрасно. То что Вы сказали
есть несусветная чушьне соответствует действительности, и всё на что Вы открыли глаза - это собственная некомпетентность.Сегодня у меня тяжёлый день, но завтра (или сегодня к вечеру) можно и притупить.
У меня есть два вопроса:
1. Вас интересует "парсинг всего чего угодно" - т.е. просто Вы хотите понять как работает универсальный автомат разбора текста, или частный случай, когда лексемы разделяются единственным разделителем (как в случае nmea)?
2. Насколько уверенно Вы оперируете понятиями "указатель" и "смещение по указателю" - мне с этого начинать, или это Вы хорошо понимаете?
NAYGER - хотел вам дать ссылку на предыдущую подобную тему - но с удивлением обнаружил. что вы ее читали и даже в ней отметились.
А можно мне напомнить о чём речь?
открыл глаза новичку
Напрасно. То что Вы сказано
есть несусветная чушьне соответствует действительности, и всё на что Вы открыли глаза - это собственная некомпетентность.Вы хотите сказать можно знать Си и не знать какой код генерирует компилятор для той или иной конструкции языка?)
Вы хотите сказать можно знать Си и не знать какой код генерирует компилятор для той или иной конструкции языка?)
Я хочу сказать, что если человек умеет программировать, то ему совершенно всё равно Си там или пёрл (прости, Господи) и, уж тем более, всё равно какой код генерирует компилятор и генерирует ли он вообще какой-то код или язык прямо интерпретируется без генерации кода (как это делается со многими языками).
А вот, если не умеет, то тут, да, тут вечно - то IDE неправильное, то отладчика нет, то тестикулы мешают.
Вы хотите сказать можно знать Си и не знать какой код генерирует компилятор для той или иной конструкции языка?)
на "знание Си" не претендую, но кое-какие завалящие программки пописываю уже лет этак 25 . при этом в ассемблере не знаю ни буквы, никогда свои или чужой код не дизассемблировал.
не подумайте. что я этим (незнаием асма) горжусь - это просто как пример, что асм не всегда является необходимым условием для программирования на Си
Я хочу сказать, что если человек умеет программировать, то ему совершенно всё равно Си там или пёрл (прости, Господи) и, уж тем более, всё равно какой код генерирует компилятор и генерирует ли он вообще какой-то код или язык прямо интерпретируется без генерации кода (как это делается со многими языками).
А вот, если не умеет, то тут, да, тут вечно - то IDE неправильное, то отладчика нет, то тестикулы мешают.
ага знаем мы таких спецов по всему сразу)) ну тогда им можно доверить только что то стандартное)
а шаг влево или вправо так он нихрена не знает)
NAYGER - хотел вам дать ссылку на предыдущую подобную тему - но с удивлением обнаружил. что вы ее читали и даже в ней отметились.
А можно мне напомнить о чём речь?
вот тема, которая тоже называлась "парсинг NMEA"
http://arduino.ru/forum/programmirovanie/parsing-nmea
а вот еще другая тема, где вы писали о том же - даю ссылку на самую суть
http://arduino.ru/forum/obshchii/kak-postich-nepostizhimoe#comment-388080
NAYGER - больше пользуйтесь поиском
ага знаем мы таких спецов по всему сразу)) ну тогда им можно доверить только что то стандартное)
а шаг влево или вправо так он нихрена не знает)
дорогой малыш (думаю, вы позволите вас так называть - ничего личного, просто перевод ника)
судя по контексту. вы-то как раз пользуетесь отладчиком и знаете асм? И как говорится в одном анекдоте "И чем вам это помогло?" :)))
ага знаем мы таких спецов по всему сразу)) ну тогда им можно доверить только что то стандартное)
а шаг влево или вправо так он нихрена не знает)
Ну, а мы знаем спецов, которые не в состоянии выучить тривиальный Бейсик, т.к. там не генерируется машинный код и дизассемблировать его невозможно, т.к. просто нечего :-)
дорогой малыш (думаю, вы позволите вас так называть - ничего личного, просто перевод ника)
судя по контексту. вы-то как раз пользуетесь отладчиком и знаете асм? И как говорится в одном анекдоте "И чем вам это помогло?" :)))
ну благодаря этому я могу решить нестандартную задачу на Си
ну благодаря этому я могу решить нестандартную задачу на Си
а можно пример нестандартной задачи?
Но вообще лучше не засорять тему. Если хотите об этом поговорить - создайте тему в Отвлеченных.,что-то типа "Нужен ли асм для программирования на Си"
Сегодня у меня тяжёлый день, но завтра (или сегодня к вечеру) можно и притупить.
У меня есть два вопроса:
1. Вас интересует "парсинг всего чего угодно" - т.е. просто Вы хотите понять как работает универсальный автомат разбора текста, или частный случай, когда лексемы разделяются единственным разделителем (как в случае nmea)?
2. Насколько уверенно Вы оперируете понятиями "указатель" и "смещение по указателю" - мне с этого начинать, или это Вы хорошо понимаете?
В предыдущем посте правильно ли я понял понятие парсинга?
1. Хочу научится переделывать полученный NMEA сигнал, например получать от GPS модуля посылки, GGA, GLL, GSA, GSV, RMC, ZTG, ZDA, а на выходе уже из имеющей информации находящейся в этих посылках, формировать свои или эти же, но, уже отредактированные.
2. С этого наверно и будем начинать.
char - это массив.
char* - а это указатель в массиве, на сколько я понимаю.
Джентльмены, дальнейший холивар (использование отладчика и пр.) будет пресекаться как не соотвествующий теме "Парсинг NMEA".
Но вообще лучше не засорять тему. Если хотите об этом поговорить - создайте тему в Отвлеченных.,что-то типа "Нужен ли асм для программирования на Си"
Поддерживаю.
NAYGER - хотел вам дать ссылку на предыдущую подобную тему - но с удивлением обнаружил. что вы ее читали и даже в ней отметились.
Это такой троллинг - открыть новую ветку на ту же тему и прикинутся новичком. который впервые слышит слово "парсинг"? Чем вас та тема с ее примерами кода не устраивает?
Тему я читал, и человек, который её создавал, по всей видимости знает гораздо больше меня в программировании. Если ещё разок посмотрите, как там я отметился, т.е. какой вопрос задал.
Тем более там человек рассматривал свой случай, под свои задачи, из чего появилось много вопросов, поэтому я и создал отдельную тему, чтоб по порядку разобраться со своими вопросами, а не влезать в середину темы другого человека и разводить кашу в итоге.
Тем более там человек рассматривал свой случай, под свои задачи
ну какие "свои задачи" в парсинге NMEA? - всем вам (новичкам) одного и того же надо... :)
Учитесь воспринимать примеры абстрактно от конкретных задач, извлекать из них то общее, что у них есть с вашими хотелками... и использовать.
Не будьте Незнайкой. который "два яблока + два яблока" сложить может, а "три груши + две груши" - уже нет. "груши мы еще не изучали"....
детский сад)
если *ip указывает на А, то, y будет равен А+Б, т.е. y=АБ ?
ага, а 2 + 3 - будет 23, правильно? :)
что за бредятину вы несете...
детский сад)
Ну как бы раздел называется Песочница. Раздел для новичков, поэтому не понимаю вашего удивления.
детский сад)
Это песочница. Здесь можно. Давно ли сам с этим вопросом разбирался? А ТС мозг, конечно, включить бы. А+В=АВ это гениально! Особенно учитывая что результат АВ должно поместиться в одну ячейку.
если *ip указывает на А, то, y будет равен А+Б, т.е. y=АБ ?
ага, а 2 + 3 - будет 23, правильно? :)
что за бредятину вы несете...
В таком случае, объясните на примерах, или дайте ссылку, где будет конкретика, с понятным объяснением, а не по большей части воды.
детский сад)
А ТС мозг, конечно, включить бы. А+В=АВ это гениально! Особенно учитывая что результат АВ должно поместиться в одну ячейку.
Человек выше ответил:
В указателе никак не может находится четыре символа. То. что у вас написано - это "прибавить к переменной, на которую указывает ia . число четыре"
Вот я и спрашиваю, как к указателю прибавить символы, с того места куда он указывает, и вообще это возможно?
И ещё такой вопрос, для чего в парсинге применяются указатели?
Вот я и спрашиваю, как к указателю прибавить символы
никак. Это как к километрам прибавить литры
К указателю можно прибавить только смещение.
например, если у нас есть массив и указатель
Представьте, что указатель это Ваш палец,который показывает на ячейку с номером и Вы видите, что в этой ячейке лежит. Вы работаете с номерами ячеек, а не с содержимым. Когда понабиться, из ячейки с нужным номером взять данные. Если вы знаете, что Вам нужно взять, например, 12 символ после точки в строке, то просматривая ячейки по номерам и дойдя до точки просто прибавляете к её номеру 12 и забираете из ячейки с полученным номером данные. Указатели применяются не только в парсинге. Это метод адресации данных.
b707 и nik182, Благодарю вас за пример и разъяснение. Теперь буду пробовать закрепить полученные знания, на примере)
С указателями проще понимание для начинающих (может и школьников), да и вообще, такое - берём рулетку (обычную) - у неё толщина (для простоты) равна 1см, поэтому представим ее как ленту с ячейками 1см на 1см. И отсчёт (для языка си, в частности) начнём с левого (если рулетку располагать слева направо) элемента. Где слева 0, потом 1 и так далее. И вот имеем «линейку ячеек 1х1». Эта линейка ни что иное как массив данных. Первый элемент (первый квадрат 1х1) имеет адрес 0 (ноль), второй элемент имеет адрес 1 и так далее. В каждом элементе может быть что-то записано - цифра «5» или буква «g». В любом случае это МАССИВ. Строки в си - это тоже массив. Указатель - это адрес ячейки. К примеру в 3й ячейке буква «а», указатель на букву «а» будет выглядеть как «указатель»+»смещение на 3».
Блин, я погнал что-то. Уже устал печатать. Такое точно не в песочнице ардуино нужно изучать/понимать. Это же основы программирования, ест отбельные сайты и форумы.
Чет от темы отклонились.
То ТС:
В принципе программа неплоха, но можно ее немного оптимизировать. Например вместо a0[15], a1[15], a2[15] сделать один двухмерный массив a[3][15]. Программа будет более красивая.
Чтобы такое сделать, надо сначала понять как одномерный массив в памяти располагается (и что из себя представляет), я считаю. Это же элементарная математика.
Чтобы такое сделать, надо сначала понять как одномерный массив в памяти располагается
Отнюдь.
И располагаться в памяти, кстати, может по-разному, на способ работы с ним это не влияет.
Можно вставить свои 0,5 копеек...
Реальная строка с ЖПС может прийти разной длины (некоторые данные могут не прийти в какой-то момент).
Поэтому указатель на конкретное место в строке не всегда приведет с тому, что хочется считать.
В этом случае парсить строку через указатели не совсем надежно...
Мне больше нравится использовать в этих строках, запятые и литеры ... пока сбоев не наблюдал...
Чтобы такое сделать, надо сначала понять как одномерный массив в памяти располагается
Отнюдь.
И располагаться в памяти, кстати, может по-разному, на способ работы с ним это не влияет.
Согласен, больше постараюсь в этой теме не надоедать.
Готового решения не надо, сразу запинывать тоже не надо, лучше небольшими пенделями пинать в нужном направлении)
Правда хотите? Я могу попробовать, но сколько бы раз не пробовал раньше, всегда кончалось одним и тем же - ТС делал вывод, что ему не надо уметь работать со строкой, а нужно распарсить конкретный пример.
Подтвердите, что готовы потратить на это неделю-две, тогда начнём
Можно вставить свои 0,5 копеек...
Реальная строка с ЖПС может прийти разной длины (некоторые данные могут не прийти в какой-то момент).
Поэтому указатель на конкретное место в строке не всегда приведет с тому, что хочется считать.
В этом случае парсить строку через указатели не совсем надежно...
Мне больше нравится использовать в этих строках, запятые и литеры ... пока сбоев не наблюдал...
В данном случае на экране будет:
То будет вид:
тс может вам поискать регулярки для ардуино раз все так запущено с указателями?)
regexp на Uno слижет всю его коротенькую память, как корова языком. Лучше уж с указателями разабраца.
regexp на Uno слижет всю его коротенькую память, как корова языком. Лучше уж с указателями разабраца.
Задача пока, поэтапно разобраться, и получить желаемый результат, пусть топорным и громоздким кодом, а вот после того, как добьюсь желаемого результата, пойдёт огранка кода, с помощью различных функций и упрощение кода, для экономии памяти.
В теме, на которую дал ссылку b707, примеры разбора по запятым имеются. Как с указателями, так и без.
Хорошо)