Switch Case Arduino 的奇怪之处

Weird things with Switch Case Arduino

好吧,我知道这听起来很奇怪,但我在 Arduino 中编写了代码,当我对每个不同的选项使用 if 语句时,它可以找到。但这就是 switch case 的用途,所以我尝试了它,出于某种奇怪的原因,它进入并执行 standbyStatus==0standbyStatus==1 的代码,但 standbyStatus==2 或 [=16] =], 什么都不执行。请注意,状态代码 1 将变量 standbyStatus 设置为 2。我可以通过串行监视器进行检查,但是 2 代码中的测试 Serial.print("case 2.1"); 没有出现。只有 END of standbymanager。同样,当我使用 if 时,一切正常。这里首先是带有 if 的代码,然后是与 switch case 相同的代码:

此外,该方法被一遍又一遍地调用。这是我的循环。

void loop() 
{
  t= millis();
  newAudio();
  calcAudioScale();
  if(standbyStatus==0){changeLEDs();}
  standbymanager();
}

该方法基本上是检查是否有声音,如 40ms 或 sth,如果没有,它将更改为待机状态一,这是 LED 的平滑变暗,如果有声音,但如果没有,它将变为待机状态二,这只是一个常亮的灯,并且每秒检查一次是否有声音。如果是这样,它将变回 stabdbyStatus 零。

代码 #1 'IF':

void standbymanager()
{          
  if(standbyStatus==0)
  {
            Serial.print(" ");
            Serial.print("case0");
            if(audio[standbyTrigger]<0)
            {
              idleCounter++;
            }
            if(idleCounter>40)
            {
              standbyStatus = 1;
            }
  }

    if(standbyStatus==1)
  {
            Serial.print(" ");
            Serial.print("case1");
            idleCounter = 0;
            float power = 0;
            for(int i=0; i<100; i++)
            {
              if(audio[standbyTrigger]>0)
                {
                  standbyStatus = 0;
                  return;
                }
              power = i/100;
              analogWrite(red, 255 - r*power);
              analogWrite(green, 255 - g*power);
              analogWrite(blue, 255 - b*power);
              delay(20); 
            }
            standbyStatus = 2;
            return;
  }

    if(standbyStatus==2)
  {
            Serial.print(" ");
            Serial.print("case 2.1");
            if(audio[standbyTrigger]>10)
                {
                  standbyStatus = 0;
                  return;
                }
            analogWrite(red, 255 - r);
            analogWrite(green, 255 - g);
            analogWrite(blue, 255 - b);
            Serial.print(" ");
            Serial.print("case2.2");
            delay(1000);
           return;
  }
  Serial.print(" ");
            Serial.print("END of StandbyManager");
}

代码 #2 'Switch Case'

void standbymanager()
{          
  switch(standbyStatus)
  {
    case 0:
            Serial.print(" ");
            Serial.print("case0");
            if(audio[standbyTrigger]<0)
            {
              idleCounter++;
            }
            if(idleCounter>40)
            {
              standbyStatus = 1;
            }
            break;

    case 1:
            Serial.print(" ");
            Serial.print("case1");
            idleCounter = 0;
            float power = 0;
            for(int i=0; i<100; i++)
            {
              if(audio[standbyTrigger]>0)
                {
                  standbyStatus = 0;
                  break;
                }
              power = i/100;
              analogWrite(red, 255 - r*power);
              analogWrite(green, 255 - g*power);
              analogWrite(blue, 255 - b*power);
              delay(20); 
            }
            standbyStatus = 2;
            break;

    case 2:
            Serial.print(" ");
            Serial.print("case 2.1");
            if(audio[standbyTrigger]>0)
                {
                  standbyStatus = 0;
                  break;
                }
            analogWrite(red, 255 - r);
            analogWrite(green, 255 - g);
            analogWrite(blue, 255 - b);
            Serial.print(" ");
            Serial.print("case2.2");
            delay(1000);
            break;

    default:
            standbyStatus=0;
            Serial.print(" ");
            Serial.print("default");
            delay(1000); 
            break;
  }
  Serial.print(" ");
            Serial.print("END of StandbyManager");
}

您可能在此处将 standbyStatus 0 更改为 1:

if(standbyStatus==0)
{
            Serial.print(" ");
            Serial.print("case0");
            if(audio[standbyTrigger]<0)
            {
              idleCounter++;
            }
            if(idleCounter>40)
            {
              standbyStatus = 1;
            }
  }

那么输入这个if语句就正常了:

if(standbyStatus==1)
{
            Serial.print(" ");
            Serial.print("case1");
            idleCounter = 0;
            float power = 0;
            for(int i=0; i<100; i++)
            {
              if(audio[standbyTrigger]>0)
                {
                  standbyStatus = 0;
                  return;
                }
              power = i/100;
              analogWrite(red, 255 - r*power);
              analogWrite(green, 255 - g*power);
              analogWrite(blue, 255 - b*power);
              delay(20); 
            }
            standbyStatus = 2;
            return;
  }

你的代码的第二个版本你使用 switch case,顾名思义你只有 select 一个。因此standbyStatus会更新但不会进入其他案例

编辑: 请注意,两个代码在做不同的事情,代码 1 可以更改 standbyStatus 并输入其他 if 语句,并且在设置 standbyStatus 后 returns。代码 2 不会 return 在它只打破循环而不是整个情况的情况下。此外,代码 2 不会像代码 1 那样进入不同的块(对于单个函数调用)。

我猜错误来自 case 1:

  • 不能在 case 语句中声明变量
  • for 中的 break 没有脱离 switch 语句

您可以将其重构为:

case 1: 
{
        Serial.print(" ");
        Serial.print("case1");
        idleCounter = 0;
        float power = 0;
        bool flag = false;
        for(int i=0; i<100; i++)
        {
          if(audio[standbyTrigger]>0)
            {
              standbyStatus = 0;
              flag = true;
              break;
            }
          power = i/100;
          analogWrite(red, 255 - r*power);
          analogWrite(green, 255 - g*power);
          analogWrite(blue, 255 - b*power);
          delay(20); 
        }
        if (flag == false) {
           standbyStatus = 2;
        }
        break;
}