我正在为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);
}
到目前为止,我遇到的问题是它将进入第一种情况,并正确识别“ person”在令牌中并将状态设置为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语句吗?任何帮助都将不胜感激!
答案 0 :(得分:3)
在情况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循环将跳过所有切换情况。
我的英语不是很好。希望你能理解。