在while循环的两次迭代之后跳过switch语句

问题描述 投票:1回答:1

我正在为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被击中后切换声明被完全绕过?任何和所有的帮助表示赞赏!

c arduino switch-statement
1个回答
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循环将跳过所有切换情况的原因。

我的英文不是很好。希望你理解它。

© www.soinside.com 2019 - 2024. All rights reserved.