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

时间:2019-03-05 22:21:01

标签: c arduino switch-statement

我正在为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语句吗?任何帮助都将不胜感激!

1 个答案:

答案 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循环将跳过所有切换情况。

我的英语不是很好。希望你能理解。