arduino中关于红外遥控的问题

利用红外遥控器
for循环中(if(mode==3)内部的)和for循环外部(loop函数刚开始的那里)两次接收红外线信号并把解码结果放在results里,每次都打印出results里的值;从串口监视器发现外部信号是固定的,但是for循环内部接收到的红外信号每次都是随机的,这是为什么?

#include 
int recv = 11;
int mode=0;
int tonepin=6;
int mode2=0;
IRrecv irrecv(recv);
decode_results results;

void setup() {
  Serial.begin(9600);
  irrecv.enableIRIn(); // 初始化红外接收器
  pinMode(tonepin,OUTPUT);
}

void loop() {
  aaa:
  Serial.print("外:") ;
  Serial.print(mode);
  Serial.println(results.value,HEX);
  if (irrecv.decode(&results)) {
    switch(results.value){
      case 0xFF30CF:mode=1;break;
      case 0xFF18E7:mode=2;break;
      case 0xFF7A85:mode=3;break;
    }
  irrecv.resume(); // 接收下一次红外线信号
  }
  
  if(mode==3){
  for(int i=0;i<=10000;i++){
    if (irrecv.decode(&results)) {//检测模式
    Serial.println(results.value,HEX);
    irrecv.resume(); // 接收下一次红外线信号
   goto aaa;
      }  
    tone(tonepin,300);
    delay(1000);
    noTone(tonepin);
  }
  }
}

这个goto太影响结构了,直接return就好了啊

#include <IRremote.h>
int recv = 11;
int mode = 0;
int tonepin = 6;
int mode2 = 0;
IRrecv irrecv(recv);
decode_results results;

void setup() {
    Serial.begin(9600);
    irrecv.enableIRIn(); // 初始化红外接收器
    pinMode(tonepin, OUTPUT);
}

void loop() {
aaa:
    Serial.print("外:");
    Serial.print(mode);
    Serial.println(results.value, HEX);
    if (irrecv.decode(&results)) {
        switch (results.value) {
        case 0xFF30CF:
            mode = 1;
            break;
        case 0xFF18E7:
            mode = 2;
            break;
        case 0xFF7A85:
            mode = 3;
            break;
        }
        irrecv.resume(); // 接收下一次红外线信号
    }

    while (irrecv.decode(&results)) {
        Serial.println(results.value, HEX);
        irrecv.resume(); // 接收下一次红外线信号
        if (results.value == 0xFF30CF)
            mode = 1;
        else if (results.value == 0xFF18E7)
            mode = 2;
        else if (results.value == 0xFF7A85)
            mode = 3;
    }
    tone(tonepin, 300);
    delay(1000);
    noTone(tonepin);
}

在 for 循环内部使用 irrecv.decode(&results) 接收红外信号时,会不断接收信号,因此每次结果都是随机的。而在 for 循环外部使用 irrecv.decode(&results) 接收红外信号时,只会接收一次信号,因此结果是固定的。

这是因为每次在for循环中调用irrecv.decode(&results)时,会清空results的值,而在for循环外部调用时就不会清空。因此在for循环内部接收到的红外信号每次都是随机的,而在for循环外部接收到的信号是固定的。
可以在 for 循环外部解码红外线信号,在内部判断和使用。
仅供参考,望采纳,谢谢。

打印需要时间,会延后你下次接受的数据,你可以做个实验,打印完之后,再去发送红外信号,再看打印信息对不对

在该代码中,loop函数中的第一个irrecv.decode语句接收到的红外信号是由遥控器发出的,而在for循环中的irrecv.decode语句接收到的红外信号是由其他来源发出的。

红外遥控器发出的信号频率是固定的,而其他来源发出的信号频率是随机的。因此,在loop函数中的第一个irrecv.decode语句接收到的红外信号值是固定的,而在for循环中的irrecv.decode语句接收到的红外信号值是随机的。

另外,在for循环中每次都会跳转到aaa,因此for循环中的irrecv.decode语句会一直重复接收红外信号,并且由于频率是随机的,所以每次接收到的红外信号值都是随机的。

为了解决这个问题,可以在for循环中使用break语句来跳出循环,或者在for循环前加一个判断条件来确保只接收一次红外信号。
此外,在for循环中使用goto语句跳转到其他位置也不是一种好的编程习惯,这会导致代码难以理解和维护。

建议更换其他循环控制语句,例如 while 循环或 do-while 循环,来替代 for 循环。

如果只需要在mode==3时才进行红外信号接收,可以在mode==3时进入一个新的循环来接收红外信号,在接收到信号后再退出循环.

还建议在接收到的红外信号后进行解码判断,不要直接打印值,这样更易于理解和维护代码.
希望对你有帮助,望采纳。