Arduino使用millis()实现非阻塞定时依次打印数字问题求助
问题根源
你当前的代码设置了两个独立的定时规则:事件1每1秒触发一次、事件2每5秒触发一次,两个事件的执行逻辑完全无关联,自然会出现每5秒先打印5次1再打印1次2的结果,和你要的每隔5秒交替输出1、2,最终依次循环输出1-6的需求不符。
正确实现方案
你只需要保留1个5秒的定时触发器,再新增一个状态变量记录下一次需要打印的数字即可,逻辑完全非阻塞,也更容易扩展到1-6的循环输出:
适配你当前1/2交替测试的代码
const unsigned long eventInterval = 5000; // 统一5秒间隔 unsigned long previousTime = 0; int nextNum = 1; // 下一次要打印的数字 void setup() { Serial.begin(9600); } void loop() { unsigned long currentTime = millis(); // 每5秒触发一次 if (currentTime - previousTime >= eventInterval) { Serial.println(nextNum); // 切换下一个要打印的数字,1和2交替 nextNum = nextNum == 1 ? 2 : 1; // 更新上次执行时间 previousTime = currentTime; } }
扩展到1-6依次循环打印的代码
如果要实现你最初的1-6依次打印需求,只需要修改状态切换的逻辑即可:
const unsigned long eventInterval = 5000; // 每5秒打印一个数字 unsigned long previousTime = 0; int currentNum = 1; // 从1开始打印 void setup() { Serial.begin(9600); } void loop() { unsigned long currentTime = millis(); if (currentTime - previousTime >= eventInterval) { Serial.println(currentNum); // 数字自增,到6之后回到1循环 currentNum++; if (currentNum > 6) { currentNum = 1; } previousTime = currentTime; } }
运行说明
上述代码不会阻塞loop()函数的其他逻辑,每5秒触发一次打印,输出顺序完全符合你的预期,如果需要调整打印间隔只需要修改eventInterval的参数即可。
内容的提问来源于stack exchange,提问作者ThP...
相关产品推荐
相关产品推荐

