我正在为Arduino项目编写状态机来解析来自Serial1输入的输入字符串。我在while循环中有一个switch语句来提升状态:
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并正确识别“person”在令牌中并将状态设置为2但在此之后的while循环的每次迭代中,它只是完全跳过switch语句。以下是一个输入字符串的输出结果:
Input String: N2 person:66 -1297 -538 2431 1331
> person:66
> Here's what it saw: person
> 2
> -1297
> -538
> 2431
> 1331
任何人都可以告诉我为什么在案件1被击中后切换声明被完全绕过?任何和所有的帮助表示赞赏!
案例1中的if else语句不正确。第一个if应该是这样的
if (i >= 0) {tok[i] = '\0';}
您缺少括号。而else语句也应该包含在这样的括号中。
if (strcmp(tok, "person") == 0)
{
state = 2;
Serial.println(state);
}
else
{
state = 1000;
}
或者,如果它只是像你的一行代码,你可以在一个单独的行中写它。
if (strcmp(tok, "person") == 0)
{
state = 2;
Serial.println(state);
}
else
state = 1000;
否则它将为状态赋值1000,这就是for循环将跳过所有切换情况的原因。
我的英文不是很好。希望你理解它。