Как хранить последовательные входы в массиве символов Arduino? - PullRequest
0 голосов
/ 09 апреля 2020

Моей целью было получить несколько частей массива char между двумя указанными символами. Код ниже отлично работает и возвращает 0037, как я ожидал. Однако я хотел сделать его пригодным для использования с последовательным вводом, а не только с символами *. Другими словами, если я напишу «123123123! 0037sjd # asdasdasd» в сериал, код должен снова работать таким же образом.

Как я могу это сделать?

const char *s = "123123123!0037sjd#asdasdasd";
const char *CHAR1 = "!";
const char *CHAR2 = "#";
char *target = NULL;
char *start, *end;

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

void loop() {
  //s=(char)Serial.read();
  if (start = strstr(s, CHAR1)) {
    start += strlen(CHAR1);
    if (end = strstr(start, CHAR2)) {
      target = (char*) malloc(end - start + 1);
      memcpy(target, start, end - start);
      target[end - start] = '\0';
    }
  }
  if (target) {
    for (int i = 0; i < 4; i++) {
      Serial.print(target[i]);
    }
    target = "";
    free(target);
  }
  target = "";
  free(target);
}

Ответы [ 2 ]

0 голосов
/ 10 апреля 2020

Для такого анализа последовательного потока, возможно, просто используйте флаг. Начните с очищенного флага. Когда вы видите ! , установите флаг. Когда цифры приходят, когда установлен флаг, сохраните их в массиве. Когда вы видите что-то, что не является ди git, снимите флажок.

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

Лично я не использую malloc / free на Arduino, и здесь он не нужен.

HTH!

0 голосов
/ 09 апреля 2020

Назначение теряет исходное распределение.

Код произвольно свободен, что-то не выделено.

// Bad
target="";        // loses prior allocation
free( target );   // Attempts to free something not allocated

Вместо

free( target );
target = NULL;
...