会飞的狼之华仔 发表于 2017-7-6 13:08:59

每隔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秒打印这是为什么呢,是哪出错了


275891381 发表于 2017-7-6 14:25:57

int time_old;
void setup() {

Serial.begin(9600);
time_old=millis();
}

void loop() {
if(millis()-time_old>=4000)
{
time_old=millis();
Serial.println(millis());
}
}
这样试试

Super169 发表于 2017-7-6 17:50:54

這個有趣, 樓上的只是要做出每四秒一次的結果, 但跟樓主的不同.就是可以解決問題, 也不是針對根源的.
樓上不用 delay 的做法, 通常是為了計算當中的 overhead, 避免超過 4s.
而樓主出現的問題, 是少於 4s, 所以是兩回事來的.樓主發現的有趣之處, 是 delay(4000) 少於 4s.而當中並沒有其他因素影響 timer 的.

我用自己的 uno 板測試, 也有相同的結果, 只是我直接把 millis() 印出來:
0, 3999, 79999......

第一次 delay 4000 時, 果然是少了 1ms.有趣.

Super169 发表于 2017-7-6 17:56:04

把程式完全簡化, 結果都是一樣, 就是第一次的 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 .有趣!

会飞的狼之华仔 发表于 2017-7-7 00:12:52

除了用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秒就打印

老胖熊 发表于 2017-7-7 09:35:34

这个有趣,是不是要去研究下delay函数?

Ansifa 发表于 2017-7-7 13:50:38

本帖最后由 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]
查看完整版本: 每隔4秒打印一下时间,为什么一开始不对呢