ARDUINO проблема с парсингом

mexicanec

✩✩✩✩✩✩✩
26 Июл 2021
7
0
Товарищи!

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

вот код

C++:
#include <AsyncStream.h>
AsyncStream<50> serial(&Serial, ';');
#include <Parser.h>


struct myStruct {
  char* nameZone;
  char* operation;
  char*  brightness;
  char*  speedMove;
  char*  breathing;
};
myStruct param_body;
myStruct param_foot;


void setup() {
  Serial.begin(9600);
}

void loop() {
  char str[50];
  if (serial.available())
  {
    strcpy(str, serial.buf);
  }

 if (strcmp(str, "body") == 0) {
   Parser data_body(str, ',');
    int am = data_body.split();
        param_body.nameZone   = data_body[0];
        param_body.operation  = data_body[1];
        param_body.brightness = data_body.getInt(2);
        param_body.speedMove  = data_body.getInt(3);
        param_body.breathing  = data_body.getInt(4);
   }
  else if (strcmp(str, "foot") == 0)
  {
       Parser data_foot(str, ',');
    int am = data_foot.split();
        param_foot.nameZone   = data_foot[0];
        param_foot.operation  = data_foot[1];
        param_foot.brightness = data_foot.getInt(2);
        param_foot.speedMove  = data_foot.getInt(3);
        param_foot.breathing  = data_foot.getInt(4);
 }

     Serial.println(param_body.nameZone);
    Serial.println(param_foot.nameZone);
}
 

Александр Симонов

★★★✩✩✩✩
2 Авг 2018
661
191
Копируй строки из парсера, а не указатели на строки. Скорей всего парсер переиспользует память, поэтому в тот же указатель попадает другая строка
 

poty

★★★★★✩✩
19 Фев 2020
1,228
365
Объявления:
C++:
void loop() {
...
   Parser data_body(str, ',');
...
       Parser data_foot(str, ',');
}
производятся внутри тела loop, поэтому уничтожаются сразу после завершения очередного прохода (имеют локальное время жизни). Либо переносите их в глобальные переменные, либо, как правильно указал @Александр Симонов, копируйте из объектов результат парсинга и сохраняйте его в глобальных переменных.

И удалите вторую Вашу тему об этом же.
 

mexicanec

✩✩✩✩✩✩✩
26 Июл 2021
7
0
Теперь вопрос, какой тип должен быть у переменной чтобы поместить туда результат парсинга

Хотя возможно понял, вечером протестирую
 

poty

★★★★★✩✩
19 Фев 2020
1,228
365
@mexicanec, определяется назначением всего этого Вашего кода. Вы парсите-то для чего? Чтобы потом применять? Вот и сохраняйте информацию в том виде (классе, структуре, переменных), которые Вы сможете применить напрямую, без дальнейшего анализа распарсеных данных.
 

mexicanec

✩✩✩✩✩✩✩
26 Июл 2021
7
0
Погодите ка, но ведь после парсинга, я сохраняю результат в глобальную структуру, ведь так? @poty,
 

poty

★★★★★✩✩
19 Фев 2020
1,228
365
@mexicanec, вы сохраняете не результат, а указатель на место памяти, где он лежит, разве не так? А потом объект, который хранится в этом месте, уничтожается по завершению цикла loop и на его место временно записывается новый объект, который тоже уничтожается по завершению цикла loop. Будь у Вас программа немного посложнее и эта область памяти вообще хранила бы нерелевантные данные.

Копируй строки из парсера, а не указатели на строки.
 
  • Лойс +1
Реакции: mexicanec