如何让Arduino的loop()仅执行一次?解决重复输出问题
Arduino loop()单次执行问题解答
1. 让loop()仅执行一次的常用方法
- 将需要单次执行的代码直接放入
setup()函数:setup()仅在Arduino上电/复位后运行一次,之后进入空的loop()即可。 - 在
loop()中使用全局布尔标记:第一次执行后将标记设为false,后续通过判断标记跳过执行逻辑。 - 执行完逻辑后进入死循环:在
loop()末尾添加while(1);,阻止loop()重复触发。
2. 当前代码重复输出的原因及解决方法
问题根源
exit(0)在Arduino环境中并非终止程序,而是触发硬件复位,导致setup()和loop()重新执行,因此输出重复。- 你代码中
while(1);被注释,未实际生效;即使启用,若放在exit(0)之后,代码根本不会执行到这一行。
修正方案
方案一:移至setup()(推荐)
直接把loop()中的业务逻辑移到setup(),loop()留空即可实现单次执行:
#include<SoftwareSerial.h> SoftwareSerial s(10,11); int roll_num =123, roll[10], i=0, r, j; char x; void setup() { s.begin(9600); Serial.begin(9600); // 原loop()中的业务逻辑 while (roll_num != 0) { r = roll_num % 10; roll[i] = r; i++; roll_num = roll_num / 10; } for(j=i-1; j>=0; j--) { Serial.print("sent number: "); Serial.println(roll[j]); s.write(roll[j]); } } void loop() { // 空函数,无重复执行逻辑 }
方案二:在loop()中使用死循环
保留loop()中的逻辑,去掉exit(0),在末尾添加死循环阻止重复:
#include<SoftwareSerial.h> SoftwareSerial s(10,11); int roll_num =123, roll[10], i=0, r, j; char x; void setup() { s.begin(9600); Serial.begin(9600); } void loop() { while (roll_num != 0) { r = roll_num % 10; roll[i] = r; i++; roll_num = roll_num / 10; } for(j=i-1; j>=0; j--) { Serial.print("sent number: "); Serial.println(roll[j]); s.write(roll[j]); } // 进入死循环,阻止loop()重复运行 while(1); }
内容的提问来源于stack exchange,提问作者Debbie
相关产品推荐
相关产品推荐

