Парсинг NMEA

NAYGER
Offline
Зарегистрирован: 15.03.2020

Доброго дня.

Хочу научиться "парсить" 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, то начиная со следующего символа, посимвольно записываем каждый символ в массив, до тех пор, пока не наткнёмся на запятую.

 

Готового решения не надо, сразу запинывать тоже не надо, лучше небольшими пенделями пинать в нужном направлении)

NAYGER
Offline
Зарегистрирован: 15.03.2020
#include
#include
#include

char s[] ="$GPRMC,214603.000,A,4634.54557,N,03047.50473,E,0.00,0.00,040617,,,A*6E";
char a0[15];
char a1[15];
char a2[15];
int i, count = 0;

int main()
{
while (s!=NULL) // считаем строку, пока не дойдём до её конца
{
while (s[i++]!=',') // считаем строку, пока не найдём запятую
{
if (s[i]==',') // если в строке находится запятая
count++; // счётчик кол-ва запятых в строке
if (count==1) // если найдена первая запятая
while (count==1 && s[i]!=',') // если счётчик равен 1 и символ в строке не равен запятой
{
s[i]++; // пока не будет выполнено условие в масив посимвольно заполняется
a0[15]=s[i]; // ??? как выделенную часть символов записать в другой массив, чтоб в дальнейшем уже работать именно с этой частью, а не со всей строкой ???
}
if (count==2) //
while (count==2 && s[i]!=',') // если счётчик равен 2 и символ в строке не равен запятой
{
s[i]++; // пока не будет выполнено условие в масив посимвольно заполняется
a1[15]=s[i]; // ??? как выделенную часть символов записать в другой массив, чтоб в дальнейшем уже работать именно с этой частью, а не со всей строкой ???
}
if (count==3) //
while (count==3 && s[i]!=',') // если счётчик равен 3 и символ в строке не равен запятой
{
s[i]++; // пока не будет выполнено условие в масив посимвольно заполняется
a2[15]=s[i]; // ??? как выделенную часть символов записать в другой массив, чтоб в дальнейшем уже работать именно с этой частью, а не со всей строкой ???
}
}
}
}

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

NAYGER пишет:

Готового решения не надо, сразу запинывать тоже не надо, лучше небольшими пенделями пинать в нужном направлении)

Правда хотите? Я могу попробовать, но сколько бы раз не пробовал раньше, всегда кончалось одним и тем же - ТС делал вывод, что ему не надо уметь работать со строкой, а нужно распарсить конкретный пример.

Подтвердите, что готовы потратить на это неделю-две, тогда начнём

baby_in_Arduino
Offline
Зарегистрирован: 21.07.2019

ЕвгенийП пишет:

NAYGER пишет:

Готового решения не надо, сразу запинывать тоже не надо, лучше небольшими пенделями пинать в нужном направлении)

Правда хотите? Я могу попробовать, но сколько бы раз не пробовал раньше, всегда кончалось одним и тем же - ТС делал вывод, что ему не надо уметь работать со строкой, а нужно распарсить конкретный пример.

Подтвердите, что готовы потратить на это неделю-две, тогда начнём

привет карантинщикам!)

чтобы научить ТС работать со строками в Си, его надо заставить посидеть в отладчике где в одном окне листинг дизассемблера выполняемый пошагово а в другом отображается память и её изменение после каждого шага отладчика)

другого пути увы НЕТ!)

а вообще научится в IDE Arduino писать на Си это гиблое дело... ни отладчика хоть какого то (я уж не говорю про нормальный) ни дизассемблера)

я уж не говорю про то как отладить какие то сложные функции без отладчика...

 

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

baby_in_Arduino пишет:

я уж не говорю ...

Вот ни не говорите. Зачем говорить-то начали? :-)

b707
Offline
Зарегистрирован: 26.05.2017

ЕвгенийП пишет:

Правда хотите? Я могу попробовать, но сколько бы раз не пробовал раньше, всегда кончалось одним и тем же - ТС делал вывод, что ему не надо уметь работать со строкой, а нужно распарсить конкретный пример.

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

NAYGER
Offline
Зарегистрирован: 15.03.2020

ЕвгенийП пишет:

Правда хотите? Я могу попробовать, но сколько бы раз не пробовал раньше, всегда кончалось одним и тем же - ТС делал вывод, что ему не надо уметь работать со строкой, а нужно распарсить конкретный пример.

Подтвердите, что готовы потратить на это неделю-две, тогда начнём

Если я правильно понял, что ПАРСИНГ NMEA сигналов - это значит разбивать, собирать, изменять, добавлять свои данные в строки, например полученные от GPS модуля, то я готов.

Тем более с нынешней ситуацией, появилось много свободного времени, которое по возможности, надо использовать с пользой)

Сразу говорю, что в этом деле туговат, но очень интересно, с примерами разбираться могу не один день, и задавать много вопросов, поэтому ЕвгенийП, тут скорее вопрос к вам, вы готовы, если да, то поехали)

ЕвгенийП, если вам удобно, могу общаться и получать примеры и задания, на почту или в любом мессенджере, а не на форуме.

baby_in_Arduino
Offline
Зарегистрирован: 21.07.2019

ЕвгенийП пишет:

Вот ни не говорите. Зачем говорить-то начали? :-)

открыл глаза новичку что нихрена путевого из обучения Си в Arduino IDE не выйдет)

новичок должен пуд соли съесть, копаясь в отладчике и дизассемблерном листинге чтобы понять как работает Си)

 

b707
Offline
Зарегистрирован: 26.05.2017

NAYGER - хотел вам дать ссылку на предыдущую подобную тему - но с удивлением обнаружил. что вы ее читали и даже в ней отметились.

Это такой троллинг - открыть новую ветку на ту же тему и прикинутся новичком. который впервые слышит слово "парсинг"? Чем вас та тема с ее примерами кода не устраивает?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

baby_in_Arduino пишет:

открыл глаза новичку

Напрасно. То что Вы сказали есть несусветная чушь не соответствует действительности, и всё на что Вы открыли глаза - это собственная некомпетентность.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Сегодня у меня тяжёлый день, но завтра (или сегодня к вечеру) можно и притупить.

У меня есть два вопроса:

1. Вас интересует "парсинг всего чего угодно" - т.е. просто Вы хотите понять как работает универсальный автомат разбора текста, или частный случай, когда лексемы разделяются единственным разделителем (как в случае nmea)?

2. Насколько уверенно Вы оперируете понятиями "указатель" и "смещение по указателю" - мне с этого начинать, или это Вы хорошо понимаете?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

b707 пишет:

NAYGER - хотел вам дать ссылку на предыдущую подобную тему - но с удивлением обнаружил. что вы ее читали и даже в ней отметились.

А можно мне напомнить о чём речь?

baby_in_Arduino
Offline
Зарегистрирован: 21.07.2019

ЕвгенийП пишет:

baby_in_Arduino пишет:

открыл глаза новичку

Напрасно. То что Вы сказано есть несусветная чушь не соответствует действительности, и всё на что Вы открыли глаза - это собственная некомпетентность.

Вы хотите сказать можно знать Си и не знать какой код генерирует компилятор для той или иной конструкции языка?) 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

baby_in_Arduino пишет:

Вы хотите сказать можно знать Си и не знать какой код генерирует компилятор для той или иной конструкции языка?) 

Я хочу сказать, что если человек умеет программировать, то ему совершенно всё равно Си там или пёрл (прости, Господи) и, уж тем более, всё равно какой код генерирует компилятор и генерирует ли он вообще какой-то код или язык прямо интерпретируется без генерации кода (как это делается со многими языками). 

А вот, если не умеет, то тут, да, тут вечно - то IDE неправильное, то  отладчика нет, то тестикулы мешают.

b707
Offline
Зарегистрирован: 26.05.2017

baby_in_Arduino пишет:

Вы хотите сказать можно знать Си и не знать какой код генерирует компилятор для той или иной конструкции языка?) 

на "знание Си" не претендую, но кое-какие завалящие программки пописываю уже лет этак 25 .  при этом в ассемблере не знаю ни буквы, никогда свои или чужой код не дизассемблировал.

не подумайте. что я этим (незнаием асма) горжусь - это просто как пример, что асм не всегда является необходимым условием для программирования на Си

baby_in_Arduino
Offline
Зарегистрирован: 21.07.2019

ЕвгенийП пишет:

Я хочу сказать, что если человек умеет программировать, то ему совершенно всё равно Си там или пёрл (прости, Господи) и, уж тем более, всё равно какой код генерирует компилятор и генерирует ли он вообще какой-то код или язык прямо интерпретируется без генерации кода (как это делается со многими языками). 

А вот, если не умеет, то тут, да, тут вечно - то IDE неправильное, то  отладчика нет, то тестикулы мешают.

ага знаем мы таких спецов по всему сразу)) ну тогда им можно доверить только что то стандартное)

а шаг влево или вправо так он нихрена не знает)

 

b707
Offline
Зарегистрирован: 26.05.2017

ЕвгенийП пишет:

b707 пишет:

NAYGER - хотел вам дать ссылку на предыдущую подобную тему - но с удивлением обнаружил. что вы ее читали и даже в ней отметились.

А можно мне напомнить о чём речь?

вот тема, которая тоже называлась "парсинг NMEA"

http://arduino.ru/forum/programmirovanie/parsing-nmea

а вот еще другая тема, где вы писали о том же - даю ссылку на самую суть

http://arduino.ru/forum/obshchii/kak-postich-nepostizhimoe#comment-388080

 

NAYGER - больше пользуйтесь поиском

b707
Offline
Зарегистрирован: 26.05.2017

baby_in_Arduino пишет:

ага знаем мы таких спецов по всему сразу)) ну тогда им можно доверить только что то стандартное)

а шаг влево или вправо так он нихрена не знает)

дорогой малыш (думаю, вы позволите вас так называть - ничего личного, просто перевод ника)

судя по контексту. вы-то как раз пользуетесь отладчиком и знаете асм? И как говорится в одном анекдоте "И чем вам это помогло?" :)))

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

baby_in_Arduino пишет:

ага знаем мы таких спецов по всему сразу)) ну тогда им можно доверить только что то стандартное)

а шаг влево или вправо так он нихрена не знает)

Ну, а мы знаем спецов, которые не в состоянии выучить тривиальный Бейсик, т.к. там не генерируется машинный код и дизассемблировать его невозможно, т.к. просто нечего :-)

baby_in_Arduino
Offline
Зарегистрирован: 21.07.2019

b707 пишет:

дорогой малыш (думаю, вы позволите вас так называть - ничего личного, просто перевод ника)

судя по контексту. вы-то как раз пользуетесь отладчиком и знаете асм? И как говорится в одном анекдоте "И чем вам это помогло?" :)))

ну благодаря этому я могу решить нестандартную задачу на Си

 

b707
Offline
Зарегистрирован: 26.05.2017

baby_in_Arduino пишет:

ну благодаря этому я могу решить нестандартную задачу на Си

а можно пример нестандартной задачи?

Но вообще лучше не засорять тему. Если хотите об этом поговорить - создайте тему в Отвлеченных.,что-то типа "Нужен ли асм для программирования на Си"

NAYGER
Offline
Зарегистрирован: 15.03.2020

ЕвгенийП пишет:

Сегодня у меня тяжёлый день, но завтра (или сегодня к вечеру) можно и притупить.

У меня есть два вопроса:

1. Вас интересует "парсинг всего чего угодно" - т.е. просто Вы хотите понять как работает универсальный автомат разбора текста, или частный случай, когда лексемы разделяются единственным разделителем (как в случае nmea)?

2. Насколько уверенно Вы оперируете понятиями "указатель" и "смещение по указателю" - мне с этого начинать, или это Вы хорошо понимаете?

В предыдущем посте правильно ли я понял понятие парсинга?

1. Хочу научится переделывать полученный NMEA сигнал, например получать от GPS модуля посылки, GGA, GLL, GSA, GSV, RMC, ZTG, ZDA, а на выходе уже из имеющей информации находящейся в этих посылках, формировать свои или эти же, но, уже отредактированные.

2. С этого наверно и будем начинать. 

char - это массив.

char* - а это указатель в массиве, на сколько я понимаю.

 

Araris
Offline
Зарегистрирован: 09.11.2012

Джентльмены, дальнейший холивар (использование отладчика и пр.) будет пресекаться как не соотвествующий теме "Парсинг NMEA".

b707 пишет:

Но вообще лучше не засорять тему. Если хотите об этом поговорить - создайте тему в Отвлеченных.,что-то типа "Нужен ли асм для программирования на Си"

Поддерживаю.

NAYGER
Offline
Зарегистрирован: 15.03.2020

b707 пишет:

NAYGER - хотел вам дать ссылку на предыдущую подобную тему - но с удивлением обнаружил. что вы ее читали и даже в ней отметились.

Это такой троллинг - открыть новую ветку на ту же тему и прикинутся новичком. который впервые слышит слово "парсинг"? Чем вас та тема с ее примерами кода не устраивает?

Тему я читал, и человек, который её создавал, по всей видимости знает гораздо больше меня в программировании. Если ещё разок посмотрите, как там я отметился, т.е. какой вопрос задал.

Тем более там человек рассматривал свой случай, под свои задачи, из чего появилось много вопросов, поэтому я и создал отдельную тему, чтоб по порядку разобраться со своими вопросами, а не влезать в середину темы другого человека и разводить кашу в итоге.

b707
Offline
Зарегистрирован: 26.05.2017

NAYGER пишет:

Тем более там человек рассматривал свой случай, под свои задачи

ну какие "свои задачи" в парсинге NMEA? - всем вам (новичкам) одного и того же надо... :)

Учитесь воспринимать примеры абстрактно от конкретных задач, извлекать из них то общее, что у них есть с вашими хотелками... и использовать.

Не будьте Незнайкой. который "два яблока + два яблока" сложить может, а "три груши + две груши" - уже нет. "груши мы еще не изучали"....

NAYGER
Offline
Зарегистрирован: 15.03.2020
В общем разбирался с указателями, в голове вроде что-то понял, а как кодом это выразить, пока не совсем.
 
Т.е. имеется массив, допустим:
char a[15]="45ds.dw,gd23";
char *ia; // указатель
char y; // переменная, для записи в неё указателя
 
С составлением кода проблема поэтому пишу так, а вы меня поправьте)
 
*ia=a[7] // тут идёт указание на 7 символ в массиве, т.е. на запятую в строке.
 
и если написать 
 
y= *ia+4;
 
то в указателе добавится ещё 4 символа и он будет равен ",gd23", так?
 
Ещё вопрос интересует, как вывести на экран данные хранящиеся в указателе?
printf(y) ???
Данные хранящиеся в массиве?
printf(a) ???
printf(a[]) ???
printf(a[15]) ???
b707
Offline
Зарегистрирован: 26.05.2017

NAYGER пишет:

В общем разбирался с указателями, в голове вроде что-то понял
 
похоже. что нифига не разобрался и ничего не понял
 
 
Цитата:
*ia=a[7] // тут идёт указание на 7 символ в массиве, т.е. на запятую в строке.
 
нет, это чушь. Уcтановить указатель ia на 7-ой элемент массива a будет
ia = a +7;
Цитата:
и если написать  y= *ia+4; то в указателе добавится ещё 4 символа и он будет равен ",gd23", так?
 
опять бред. В указателе никак не может находится четыре символа. То. что у вас написано - это "прибавить к переменной, на которую указывает ia . число четыре"
 
Цитата:
Ещё вопрос интересует, как вывести на экран данные хранящиеся в указателе?
printf(y) ???
Данные хранящиеся в массиве?
printf(a) ???
printf(a[]) ???
printf(a[15]) ???
 
массив печатается поэлементно с помощью цикла. например for
NAYGER
Offline
Зарегистрирован: 15.03.2020
Что-то не понял тогда.
 
Вот вырезка из учебника:
int *ip; /* ip - указатель на int */
ip = &z[0]; /* ip теперь указывает на z[0] */    Тут на что указатель указывает, на начало массива, на элемент в массиве?
т.е. если массив "45ds.dw,gd23".
то ip = &z[0];  не указывает на "4" в начале массива?
 
Вырезка:
у = *ip + 1
берет то, на что указывает ip, и добавляет к нему 1, а результат присваивает переменной y.
 
т.е. тут просто на 1 увеличение идёт, как если бы *ip=2, то отсюда y=3
или всё таки, если *ip указывает на А, то, y будет равен А+Б, т.е. y=АБ ?
baby_in_Arduino
Offline
Зарегистрирован: 21.07.2019

детский сад)

b707
Offline
Зарегистрирован: 26.05.2017

NAYGER пишет:

если *ip указывает на А, то, y будет равен А+Б, т.е. y=АБ ?

ага, а 2 + 3 - будет 23, правильно? :)

что за бредятину вы несете...

NAYGER
Offline
Зарегистрирован: 15.03.2020

baby_in_Arduino пишет:

детский сад)

Ну как бы раздел называется Песочница. Раздел для новичковпоэтому не понимаю вашего удивления.

nik182
Offline
Зарегистрирован: 04.05.2015

baby_in_Arduino пишет:

детский сад)

Это песочница. Здесь можно. Давно ли сам с этим вопросом разбирался? А ТС мозг, конечно, включить бы. А+В=АВ это гениально! Особенно учитывая что результат АВ должно поместиться в одну ячейку.  

NAYGER
Offline
Зарегистрирован: 15.03.2020

b707 пишет:

NAYGER пишет:

если *ip указывает на А, то, y будет равен А+Б, т.е. y=АБ ?

ага, а 2 + 3 - будет 23, правильно? :)

что за бредятину вы несете...

В таком случае, объясните на примерах, или дайте ссылку, где будет конкретика, с понятным объяснением, а не по большей части воды.

NAYGER
Offline
Зарегистрирован: 15.03.2020

nik182 пишет:

baby_in_Arduino пишет:

детский сад)

А ТС мозг, конечно, включить бы. А+В=АВ это гениально! Особенно учитывая что результат АВ должно поместиться в одну ячейку.  

Человек выше ответил:

b707 пишет:

В указателе никак не может находится четыре символа. То. что у вас написано - это "прибавить к переменной, на которую указывает ia . число четыре"

Вот я и спрашиваю, как к указателю прибавить символы, с того места куда он указывает, и вообще это возможно?

NAYGER
Offline
Зарегистрирован: 15.03.2020

И ещё такой вопрос, для чего в парсинге применяются указатели?

b707
Offline
Зарегистрирован: 26.05.2017

NAYGER пишет:

Вот я и спрашиваю, как к указателю прибавить символы

никак. Это как к километрам прибавить литры

К указателю можно прибавить только смещение.

например, если у нас есть массив и указатель

char a[] = "ABCDE";
char* ptr;

ptr = a;                   //указатель указывает на начало массива
// печаетм значение, на которое указывает ptr
Serial.print(*ptr);  // напечатет A

//передвигаем указатель на три позиции
ptr = a+3;               // теперь указатель указывает на элемент a[3]
Serial.print(*ptr);  // напечатет D

 

nik182
Offline
Зарегистрирован: 04.05.2015

Представьте, что указатель это Ваш палец,который показывает на ячейку с номером и Вы видите, что в этой ячейке лежит. Вы работаете с номерами ячеек, а не с содержимым. Когда понабиться, из ячейки с нужным номером взять данные. Если вы знаете, что Вам нужно взять, например, 12 символ после точки в строке, то просматривая ячейки по номерам и дойдя до точки просто прибавляете к её номеру 12 и забираете из ячейки с полученным номером данные. Указатели применяются не только в парсинге. Это метод адресации данных.     

NAYGER
Offline
Зарегистрирован: 15.03.2020

b707 и nik182, Благодарю вас за пример и разъяснение. Теперь буду пробовать закрепить полученные знания, на примере)

 

 

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

С указателями проще понимание для начинающих (может и школьников), да и вообще, такое - берём рулетку (обычную) - у неё толщина (для простоты) равна 1см, поэтому представим ее как ленту с ячейками 1см на 1см. И отсчёт (для языка си, в частности) начнём с левого (если рулетку располагать слева направо) элемента. Где слева 0, потом 1 и так далее. И вот имеем «линейку ячеек 1х1». Эта линейка ни что иное как массив данных. Первый элемент (первый квадрат 1х1) имеет адрес 0 (ноль), второй элемент имеет адрес 1 и так далее. В каждом элементе может быть что-то записано - цифра «5» или буква «g». В любом случае это МАССИВ. Строки в си - это тоже массив. Указатель - это адрес ячейки. К примеру в 3й ячейке буква «а», указатель на букву «а» будет выглядеть как «указатель»+»смещение на 3». 
Блин, я погнал что-то. Уже устал печатать. Такое точно не в песочнице ардуино нужно изучать/понимать. Это же основы программирования, ест отбельные сайты и форумы. 

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

Чет от темы отклонились.

То ТС:

В принципе программа неплоха, но можно ее немного оптимизировать. Например вместо a0[15], a1[15], a2[15] сделать один двухмерный массив a[3][15]. Программа будет более красивая.

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

Чтобы такое сделать, надо сначала понять как одномерный массив в памяти располагается (и что из себя представляет), я считаю. Это же элементарная математика. 

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

BOOM пишет:

Чтобы такое сделать, надо сначала понять как одномерный массив в памяти располагается

Отнюдь.

И располагаться в памяти, кстати, может по-разному, на способ работы с ним это не влияет.

renoshnik
Offline
Зарегистрирован: 11.04.2013

Можно вставить свои 0,5 копеек...

Реальная строка с ЖПС может прийти разной длины (некоторые данные могут не прийти в какой-то момент).

Поэтому указатель на конкретное место в строке не всегда приведет с тому, что хочется считать.

В этом случае парсить строку через указатели не совсем надежно...

Мне больше нравится использовать в этих строках, запятые и литеры ... пока сбоев не наблюдал...

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

andriano пишет:

BOOM пишет:

Чтобы такое сделать, надо сначала понять как одномерный массив в памяти располагается

Отнюдь.

И располагаться в памяти, кстати, может по-разному, на способ работы с ним это не влияет.

Согласен, больше постараюсь в этой теме не надоедать. 

NAYGER
Offline
Зарегистрирован: 15.03.2020

ЕвгенийП пишет:

NAYGER пишет:

Готового решения не надо, сразу запинывать тоже не надо, лучше небольшими пенделями пинать в нужном направлении)

Правда хотите? Я могу попробовать, но сколько бы раз не пробовал раньше, всегда кончалось одним и тем же - ТС делал вывод, что ему не надо уметь работать со строкой, а нужно распарсить конкретный пример.

Подтвердите, что готовы потратить на это неделю-две, тогда начнём

 
ЕвгенийП, обещал, что научит парсить за одну-две недели, но видимо понял, что случай тяжёлый и поэтому решил не озадачиваться)
 

renoshnik пишет:

Можно вставить свои 0,5 копеек...

Реальная строка с ЖПС может прийти разной длины (некоторые данные могут не прийти в какой-то момент).

Поэтому указатель на конкретное место в строке не всегда приведет с тому, что хочется считать.

В этом случае парсить строку через указатели не совсем надежно...

Мне больше нравится использовать в этих строках, запятые и литеры ... пока сбоев не наблюдал...

 
Вот тоже думал по этому поводу, а стоило ли затрагивать указатели?
 
Допустим мне надо провести операции начиная со второй запятой.
Если есть приём, то посылка будет иметь такой вид:
$GPRMC,214603.000,A,4634.54557,N,03047.50473,E,0.00,0.00,040617,,,A*6E
указатель=массив+17; - Тут указатель указывает на вторую запятую в строке.
 
а вот если нет приёма, то такой:
$GPRMC,0,A,0,N,0,E,0.00,0.00,0,,,A*6E
указатель=массив+17; - В таком случае указатель, будет указывать не на запятую, а на "E".
Соответственно программа будет работать не правильно.
 
Пока научился с помощью счётчика запятых, выводить на экран интересующие участки в строке между запятыми.
 
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char s[100]="$GPRMC,214603.000,A,4634.54557,N,03047.50473,E,0.00,0.00,040617,,,A*6E";
int i;
long count=0;

int main()

{
for (i=0; s[i]!='\n'; i++)
{
    if (s[i]==',')
        count++;
        {
            if (count==0 && s[i]!=',')
                printf("%c ",s[i]);

            if (count==1 && s[i]!=',')
                printf("%c ",s[i]);
              
            if (count==5 && s[i]!=',')
                printf("%c ",s[i]);
        }
}
}

В данном случае на экране будет:

$ G P R M C 2 1 4 6 0 3 . 0 0 0 0 3 0 4 7 . 5 0 4 7 3
 
Сейчас до окончания цикла, информация выводится на экран посимвольно.
Т.е. если написать:
if (count==0 && s[i]!=',')
    printf("%c ",s[i]);
    printf("\n");

То будет вид:

$
G
P
R
M
C
Пока не получается, чтоб одной строкой выводилось:
$GPRMC
а потом только осуществлялся переход на следующую строку.
baby_in_Arduino
Offline
Зарегистрирован: 21.07.2019

тс может вам поискать регулярки для ардуино раз все так запущено с указателями?)

 

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

regexp на Uno слижет всю его коротенькую память, как корова языком.  Лучше уж с указателями разабраца. 

NAYGER
Offline
Зарегистрирован: 15.03.2020

DetSimen пишет:

regexp на Uno слижет всю его коротенькую память, как корова языком.  Лучше уж с указателями разабраца. 

Задача пока, поэтапно разобраться, и получить желаемый результат, пусть топорным и громоздким кодом, а вот после того, как добьюсь желаемого результата, пойдёт огранка кода, с помощью различных функций и упрощение кода, для экономии памяти.

sadman41
Offline
Зарегистрирован: 19.10.2016

В теме, на которую дал ссылку b707, примеры разбора по запятым имеются. Как с указателями, так и без.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

NAYGER пишет:

ЕвгенийП, обещал, что научит парсить за одну-две недели, но видимо понял, что случай тяжёлый и поэтому решил не озадачиваться)
Нет, почему, просто так получилось, что я на некоторое время вообще с форума выпал (так сложилось, простите). Вот вернулся, с понедельника и начнём :-)
NAYGER
Offline
Зарегистрирован: 15.03.2020

ЕвгенийП пишет:

NAYGER пишет:

ЕвгенийП, обещал, что научит парсить за одну-две недели, но видимо понял, что случай тяжёлый и поэтому решил не озадачиваться)
Нет, почему, просто так получилось, что я на некоторое время вообще с форума выпал (так сложилось, простите). Вот вернулся, с понедельника и начнём :-)

Хорошо)