Switch Case Arduino 的奇怪之处
Weird things with Switch Case Arduino
好吧,我知道这听起来很奇怪,但我在 Arduino 中编写了代码,当我对每个不同的选项使用 if 语句时,它可以找到。但这就是 switch case 的用途,所以我尝试了它,出于某种奇怪的原因,它进入并执行 standbyStatus==0
和 standbyStatus==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;
}
好吧,我知道这听起来很奇怪,但我在 Arduino 中编写了代码,当我对每个不同的选项使用 if 语句时,它可以找到。但这就是 switch case 的用途,所以我尝试了它,出于某种奇怪的原因,它进入并执行 standbyStatus==0
和 standbyStatus==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;
}