You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 17:10:29