Невозможно разбить строку на 2 символа

Я пытаюсь разделить входящую строку на 2 целочисленных значения, так как с ее помощью мне нужно управлять двумя двигателями постоянного тока. Процессор является узлом MCU, и я получаю следующую ошибку: -

Чтение Com-порта:-

WiFi connected
Received: "84+62"
"84+62"

Soft WDT reset

>>>stack>>>

ctx: cont
sp: 3ffffd90 end: 3fffffc0 offset: 01b0
3fffff40:  2b343822 00223236 3ffee70c 40204148  
3fffff50:  3ffe85ee 3ffee6d8 3ffee70c 402043c5  
3fffff60:  3ffe85dc 3ffee70c 3ffee6d8 402043c5  
3fffff70:  3ffe85f0 3ffee69c 00000000 00000001  
3fffff80:  00000000 40200038 3ffefca4 0000000f  
3fffff90:  00000007 00000000 00000001 402048f9  
3fffffa0:  3fffdad0 00000000 3ffee744 40204984  
3fffffb0:  feefeffe feefeffe 3ffe851c 401009a5  
<<<stack<<<

 ets Jan  8 2013,rst cause:2, boot mode:(3,6)

load 0x4010f000, len 1384, room 16 
tail 8
chksum 0x2d
csum 0x2d
v951aeffa
~ld

Код:-

if (msg.length() > 0) {
        Serial.print("Received: "); Serial.println(msg);
        char charBuf[50];
        msg.toCharArray(charBuf, 50);
        Serial.println(charBuf);

        char left[3] = {};
        char right[3] = {};
        int n = 0;

        while (charBuf != 0) {
          for (int i = 0; i < strlen(charBuf); i ++) {
            if (charBuf[i] != '+') {
              left[n] += charBuf[i];
              n++;
            }
            else {
              n = 0;
              break;
            }
            right[n] += charBuf[i];
            n++;
          }
        }
        Serial.println("Left Motor: "); Serial.print(left);
        Serial.println("Right Motor: "); Serial.print(right);

    }

Мой желаемый результат следующий:-

Left Motor: 84
Right Motor: 62

Итак, какие изменения мне нужно внести?

, 👍1

Обсуждение

ваш код зацикливается while (charBuf != 0) { до тех пор, пока сторожевой таймер не сбросит MCU, @Juraj

Используйте strtok(), чтобы разделить строку., @Majenko

можете ли вы показать пример использования strtok(), @suu


3 ответа


Лучший ответ:

0

Вот пример скетча, в котором используется strtok().

char charBuf[] = "\"84+62\"";

// Установите размер массива на максимальное количество целых чисел, которые вы получите.
uint16_t myArray[2];

void setup(){

  Serial.begin(9600);

  int counter = 0;
  char* pch = strtok(charBuf, "\"+");

  while(pch != NULL){
    myArray[counter] = atoi(pch);
    pch = strtok(NULL, "\"+");
    counter += 1;
  }

  // Распечатываем содержимое целочисленного массива.
  for(int i = 0; i < counter; i++){
    Serial.println(myArray[i]);
  }
}

void loop(){}

myArray[0] содержит 84, а myArray[1] содержит 62.

,

0

Эта утечка памяти возникает из-за переполнения переменной right. Этого не происходит в самом цикле for, хотя это можно было бы реализовать более простым способом. Но это цикл while, который не заканчивается (charBuf не меняется и не становится равным 0), а на второй итерации n изначально будет равен 1 ( из-за n++ в конце цикла for). Это вызывает переполнение right[n] += charBuf[i];.

Итак: удалите цикл while (и используйте strtok()).

,

0

"84+62"

Дополнительные символы двойных кавычек являются частью вашей строки и charBuf

    Serial.println(charBuf);  // Текст с " и +

    char* cpl = nullptr;
    char* cpr = nullptr; 
    for (char* cp = charBuf; *cp != 0; cp++) {
        if (*cp != '"' && ! cpl )  cpl = cp;
        if (*cp == '"') *cp = 0;           
        if (*cp == '+' ) {
          *cp = 0; // расколоть
          cpr = cp+1;  
        }
    }
    Serial.println("Left Motor: "); Serial.println(atoi(cpl));
    Serial.println("Right Motor: "); Serial.print(atoi(cpr));
,