每隔4秒打印一下时间,为什么一开始不对呢
想实现的功能: 每隔4秒打印一下时间
void setup() {
Serial.begin(9600);
}
void loop() {
Serial.println(millis()/1000);
delay(4000);
}
但是前面并不是间隔4秒打印,后面才是每隔4秒打印,结果如下:
0
3
7
12
16
19
24
28
32
36
40
44
48
52
56
从24开始才是每隔4秒打印这是为什么呢,是哪出错了
int time_old;
void setup() {
Serial.begin(9600);
time_old=millis();
}
void loop() {
if(millis()-time_old>=4000)
{
time_old=millis();
Serial.println(millis());
}
}
这样试试 這個有趣, 樓上的只是要做出每四秒一次的結果, 但跟樓主的不同.就是可以解決問題, 也不是針對根源的.
樓上不用 delay 的做法, 通常是為了計算當中的 overhead, 避免超過 4s.
而樓主出現的問題, 是少於 4s, 所以是兩回事來的.樓主發現的有趣之處, 是 delay(4000) 少於 4s.而當中並沒有其他因素影響 timer 的.
我用自己的 uno 板測試, 也有相同的結果, 只是我直接把 millis() 印出來:
0, 3999, 79999......
第一次 delay 4000 時, 果然是少了 1ms.有趣.
把程式完全簡化, 結果都是一樣, 就是第一次的 delay(400) 會出問題:
void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
Serial.println(millis());
delay(4000);
Serial.println(millis());
}
void loop() {
// put your main code here, to run repeatedly:
}
再三測試, delay(1), delay(2), delay(3) 都沒問題, 在 delay(4) 或以上時, 就會少了 1 ms .有趣!
除了用delay()外,还可以有两种不同的方法可以正确实现打印功能,如下
方法一:
/*
* 功能:每隔4秒打印时间
*/
int duration=4000;
long previousMillis=0;
void setup() {
Serial.begin(9600);
}
void loop() {
Serial.println(millis()/1000);
previousMillis=millis();
while(millis()-previousMillis<=duration){
}
}
方法二:
/*
* 功能:每隔4秒打印时间
*/
int duration=4000;
long previousMillis=0;
void setup() {
Serial.begin(9600);
}
void loop() {
if(millis()-previousMillis>duration){
previousMillis=millis();
Serial.println(millis()/1000);
}
}
经过测试以上两个程序都能正确实现每隔4秒打印下时间,但是我找不到用delay()时(就是第一个程序),为什么不能实现每隔
4秒就打印 这个有趣,是不是要去研究下delay函数? 本帖最后由 Ansifa 于 2017-7-7 14:01 编辑
我最懒。。。:o
方法三:
void setup() {
Serial.begin(9600);
}
void loop()
{
if ((millis() % 4000) == 0)
{
Serial.println(millis() / 1000);
delay(1);
}
}
页:
[1]