如何在 Arduino 中打破无限

Posted

技术标签:

【中文标题】如何在 Arduino 中打破无限【英文标题】:How to break infinite while in Arduino 【发布时间】:2016-02-11 23:09:27 【问题描述】:

A-R-D-U-I-N-O 电路,包括焊盘编号和带有此代码的 LED

char keys[ROWS][COLS] = 
  '1','2','3','A',
  '4','5','6','B',
  '7','8','9','C',
  '*','0','#','D'
;

void setup() 
    pinMode(13,OUTPUT);
    Serial.begin(9600);


void loop() 
    char key = keypad.getKey();

    if (key) 
        Serial.println(key);
        switch(key) 
            case 'A': 
            while(1)
            
                digitalWrite(13,HIGH);
                delay(1000);
                digitalWrite(13,LOW);
                delay(1000);
            
        break;
    

我怎样才能制作另一个案例,例如(case 'D') 来停止这个无限循环?

【问题讨论】:

这是什么语言 你将无法做出这样的事情。以这种方式使用无限循环不应该是一个好主意。尝试另一种控制方式,例如用millis()测量时间。 【参考方案1】:

您无法退出 while 循环,因此您将继续运行代码

digitalWrite(13,HIGH);
delay(1000);
digitalWrite(13,LOW);
delay(1000);

为了能够运行案例“D”之类的案例,您将永远不会离开此循环。您需要在 while 循环中放置一个 if 语句,以检查您想要的任何内容。如果是真的那么你应该break;

if (statement) break;

【讨论】:

【参考方案2】:

好吧,实际上您不能从外部中断该 while,因为程序只会在 while 循环内运行这些指令。也许你应该使用另一种策略。一种是使用另一个变量来保存选项。 比如:

void loop()

int option = 0;

char key = keypad.getKey();

if (key)

   Serial.println(key);
   switch(key)
     case 'A': option = 1; break;
     case 'B': option = 2; break;
   


if(option == 1)

  digitalWrite(13,HIGH);
  delay(1000);
  digitalWrite(13,LOW);
  delay(1000);

else if(option == 2)
...

【讨论】:

【参考方案3】:

看起来您的“switch”案例格式有点错误,我认为他们总是必须有一个默认案例。您的代码似乎也缺少键盘包含/定义。

至于问题可能总是有一个标志,即两个按钮打开/关闭,然后根据该标志闪烁 LED。

#include <Keypad.h>
const byte ROWS = 4;
const byte COLS = 4;

byte rowPins[ROWS] = 5, 6, 7, 8; //connect to the row pinouts of the keypad
byte colPins[COLS] = A3, A2, A1, A0; //connect to the column pinouts of the keypad

Keypad keypad = Keypad( makeKeymap(Keys), rowPins, colPins, ROWS, COLS);
//yes i know that looks horrible 
//would always have a different name for the keypad myself

char keys[ROWS][COLS] = 
  '1','2','3','A',
  '4','5','6','B',
  '7','8','9','C',
  '*','0','#','D'
;
int flag=0;

void setup() 
pinMode(13,OUTPUT);
Serial.begin(9600);


void loop() 
  char key = keypad.getKey();

  if (key) 
    Serial.println(key);
    switch(key) 
        case 'A': 
          flag=1;
          break;

        case 'D':
          flag=0;
          break;

        default:
          break
      
    
  if(flag)
  digitalWrite(13,HIGH);
  delay(1000);
  digitalWrite(13,LOW);
  delay(1000);
  

唯一的问题是,在闪烁之间延迟时,它不会测试按键,因此要关闭标志,您必须按住“D”超过两秒钟,甚至可以点击它。我已经有一段时间没有使用这些键盘了。

【讨论】:

以上是关于如何在 Arduino 中打破无限的主要内容,如果未能解决你的问题,请参考以下文章

单片机arduino如何一次声明多个数

如何在3次请求后中断此Javascript HTTP无限请求循环?

如何允许无限制的发布请求 expressjs

arduino IDE 主函数入口在哪?

打破节点repl中的无限循环?

如何在 Perl 中测试 STDIN 而不会阻塞?