出于某种原因,这永远不会退出 for 循环以打印出最终值

For some reason this never exits the for loop to print out the final value

本文关键字:循环 打印 for 某种原因 永远 退出      更新时间:2023-10-16

所以基本上下面的代码永远不会退出 for 循环,我需要它退出 for 循环,以便在缓冲区循环通过每个字符后打印缓冲区最终包含的任何内容。但是,正如我之前所说,循环(据我所知)只是继续运行并且不会结束,因此为什么缓冲区永远不会在循环外部打印(我知道它在循环内反复打印)。我相当确定,如果带有中断命令的语句可以在这里解决问题,但是在盯着它一段时间后,我仍然无法弄清楚它会是什么。

另一个注意事项是,代码不能位于void loop()函数内,而必须位于void setup()函数内

这是代码

char iValue;
const int bufflen = 10;
char buffer[bufflen];
void setup() {
  Serial.begin(9600);
  Serial.println(buffer);
  int index = 0;
  int i = 0;
  for(i=0;i<bufflen;i++) {
      while (!Serial.available()) {
          ;
      }
      iValue = Serial.read();
      buffer[index] = iValue;
      //Serial.println(buffer);
      //Serial.println(iValue);
      Serial.println(buffer);
      index++;
      if (index > bufflen){
          break;
      }
  }
  Serial.println(buffer);
}
void loop() {
}

有没有可能虽然(!Serial.available()) 循环导致挂起?如果串行对象没有在另一个线程中填充,那么一旦进入 while 循环,它会阻止读取更多数据的任何能力吗?

你必须使用条件'while(Serial.available()) {//do something }''

这样,主loop()函数将继续运行,并且只有在满足条件时(即有串行数据可供读取时)才会执行while循环。

Serial.available()函数是对在void loop()之外运行的另一个函数的回调

这就是真正的Arduino程序的样子:

int main(void)
{
 init();
 initVariant();
#if defined(USBCON)
 USBDevice.attach();
#endif
 setup();
 for (;;) {
  loop();
  if (serialEventRun) serialEventRun();
 }
 return 0;
}

如您所见,如果您的程序卡在内部循环while(!Serial.avalaible()),则无法到达"if (serialEventRun) serialEventrun();"行。因此,您遇到的问题。

以下是Arduino Google群组中关于此问题的一个非常有趣的讨论:

希望这有帮助。