Оператор Switch пропускается после двух итераций цикла while - PullRequest
1 голос
/ 06 марта 2019

Я пишу конечный автомат для проекта 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? Любая помощь приветствуется!

1 Ответ

3 голосов
/ 06 марта 2019

Ваше утверждение if else в случае 1 неверно. Первое, если должно быть так

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 пропустил бы все случаи переключения.

Мой английский не очень хорош. Надеюсь, вы понимаете это.

...