Я пишу конечный автомат для проекта Arduino для анализа входной строки из ввода Serial1. У меня есть оператор switch в цикле while, который продвигает состояние:
char * tok = strtok(instr, " \r\n"); //instr is the input string
int state = 0;
int targx = 0, targy = 0;
while (tok)
{
// State machine:
// 0: start parsing
// 1: N2 command, parse prediction
// 2: Correct prediction, parse targx
// 3: Parse targy
// 4: Target parsing complete
// 1000: Wrong prediction / unknown command
switch (state)
{
case 0:
if (strcmp(tok, "N2") == 0) state = 1;
else if (strcmp(tok, "PANGAIN") == 0) state = 5;
else if (strcmp(tok, "TILTGAIN") == 0) state = 7;
else state = 1000;
break;
case 1:
//Look for a person
int i = strlen(tok) - 1;
while(i >= 0 && tok[i] != ':') {i--;}
if (i >= 0) tok[i] = '\0';
Serial.print("Here's what it saw: ");
Serial.print(tok);
Serial.print("\n");
if (strcmp(tok, "person") == 0)
{
state = 2;
Serial.println(state);
}
else state = 1000;
break;
case 2:
Serial.println("Inside case 2");
targx = atoi(tok);
Serial.print("Targx = ");
Serial.print(targx, DEC);
Serial.println("");
state = 3;
break;
case 3:
targy = atoi(tok);
Serial.print("Targy = ");
Serial.print(targy, DEC);
Serial.println("");
state = 4;
break;
default:
break;
}
// Move to the next token:
tok = strtok(0, " \r\n");
Serial.println(tok);
}
Проблема, с которой я столкнулся на данный момент, заключается в том, что он доберется до случая 1 и правильно определит, что «человек» находится в токене, и установит состояние на 2, но на каждой итерации цикла while после этого он просто пропускает сменить заявление полностью. Вот как выглядит вывод для одной входной строки:
Input String: N2 person:66 -1297 -538 2431 1331
> person:66
> Here's what it saw: person
> 2
> -1297
> -538
> 2431
> 1331
Может кто-нибудь сказать мне, почему оператор switch полностью игнорируется после случая 1? Любая помощь приветствуется!