【问题标题】:arduino while loop only executes oncearduino while循环只执行一次
【发布时间】:2016-04-11 03:32:55
【问题描述】:

首先,我是这个网站和 arduino 的新手,所以我确信这只是一个愚蠢的错误。

我正在努力让我的 arduino 扮演刽子手。它不完整,所以目前它所做的只是接收串行输入并在 16x2 LCD 屏幕上制作下划线和空格。

我的代码如下所示。

#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
String content = "";
int loopcount=0;
int loopend;
char character;
void setup(){
  Serial.begin(9600);
  lcd.begin(16, 2);
  lcd.setCursor(0,1);
  while(!Serial.available()){}

  while(Serial.available()) {
    character = Serial.read();
    delay(5);
    content.concat(character);
  }

  loopend=content.length();

  while(!loopend==loopcount){
    if(content.charAt(loopcount)==' '){
    lcd.print(' ');
  }else{
    lcd.print('_');
  }

  loopcount++;
  }
}

void loop(){
}

问题是,用于打印 ' ' 或 '_' 的 while 循环只运行一次。我没有收到错误消息,第一个字符工作正常。 提前致谢!

【问题讨论】:

    标签: while-loop arduino lcd


    【解决方案1】:

    首先,让我们从代码中的实际错误开始。查看你的循环

    while(!loopend==loopcount){
        if (content.charAt(loopcount)==' '){
            lcd.print(' ');
        } else {
            lcd.print('_');
        }
        loopcount++;
    }
    

    问题是 !操作员。看起来你的循环应该在 loopend 等于 loopcount 时立即结束。但要使其工作,您必须将其写为!(loopend == loopcount)loopend != loopcount。因为它首先否定 loopend,然后将其与 loopcount 进行比较。这使得只要 loopcount 大于零,无论 loopend 的值如何,条件都会评估为真。因此,只需将其修复为这些替代方案中的任何一个(尽管使用 != 更清洁 imo)。

    但是,为避免将来出现此类错误,您可以进行一些设计更改。首先,没有理由将循环迭代变量(loopcount 和 loopend)限定在 setup 函数之外。您可以在该函数中声明和初始化它们,这样它们就不会具有全局范围。其次,使用 for 循环而不是 while 循环将减少出错的机会,因为这正是 for 循环的用途。

    那么循环代码就变成了

    int len = content.length();
    for (int i = 0; i < len; i++) {
        if(content.charAt(i)==' '){
           lcd.print(' ');
        } else{
           lcd.print('_');
        }
    }
    

    最后,您应该真正缩进您的代码。我不确定您的代码是否在您的开发环境中正确缩进并且它只是在这个问题中搞砸了。但是,如果您必须努力查看代码块的开始和结束位置,则更难发现错误。

    【讨论】:

      【解决方案2】:

      我不知道这是否有帮助

      #include <LiquidCrystal.h>
      LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
      String content = "";
      int loopcount=0;
      int loopend;
      char character;
        void setup(){
          Serial.begin(9600);
          lcd.begin(16, 2);
          lcd.setCursor(0,1);
        }
      
        void loop(){
         // while(!Serial.available()){}
            while(Serial.available()) {
            character = Serial.read();
            delay(5);
            content.concat(character);
              loopend=content.length();
        }
      
      
      while(loopcount < loopend){
        if(content.charAt(loopcount)==' '){
       Serial.println(' ');
        }else{
        Serial.print('_');
          Serial.print(" ");
        loopcount++;}
          }
      
       delay(5);
      
      
          }
      

      【讨论】: