Невозможно разбить строку на 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
Итак, какие изменения мне нужно внести?
@suu, 👍1
Обсуждение3 ответа
Лучший ответ:
Вот пример скетча, в котором используется 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.
Эта утечка памяти возникает из-за переполнения переменной right
. Этого не происходит в самом цикле for, хотя это можно было бы реализовать более простым способом. Но это цикл while, который не заканчивается (charBuf
не меняется и не становится равным 0), а на второй итерации n
изначально будет равен 1 ( из-за n++
в конце цикла for). Это вызывает переполнение right[n] += charBuf[i];
.
Итак: удалите цикл while
(и используйте strtok()
).
"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));
- Сообщение об ошибке: "exit status 1 expected initializer before 'void'."
- Проблема с отображением времени Ntp на oled с использованием библиотеки U8G2.
- Ошибка при компиляции кода модуля NODE MCU ESP8266-12E в Arduino ide
- Узел MCU не работает правильно
- NodeMCU - Vin контакт как выход 5V?
- Как заставить 5-вольтовое реле работать с NodeMCU
- ESP8266 не подключается к Wi-Fi
- Разве в узле MCU v3 (LoLin) нет встроенного светодиода?
ваш код зацикливается
while (charBuf != 0) {
до тех пор, пока сторожевой таймер не сбросит MCU, @JurajИспользуйте strtok(), чтобы разделить строку., @Majenko
можете ли вы показать пример использования strtok(), @suu