极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 18725|回复: 6

每隔4秒打印一下时间,为什么一开始不对呢

[复制链接]
发表于 2017-7-6 13:08:59 | 显示全部楼层 |阅读模式

想实现的功能:      每隔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秒打印这是为什么呢,是哪出错了


回复

使用道具 举报

发表于 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());
}
}
这样试试
回复 支持 1 反对 0

使用道具 举报

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

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

第一次 delay 4000 時, 果然是少了 1ms.  有趣.
回复 支持 反对

使用道具 举报

发表于 2017-7-6 17:56:04 | 显示全部楼层
把程式完全簡化, 結果都是一樣, 就是第一次的 delay(400) 會出問題:

  1. void setup() {
  2.   // put your setup code here, to run once:
  3.   Serial.begin(9600);
  4.   Serial.println(millis());
  5.   delay(4000);
  6.   Serial.println(millis());
  7. }

  8. void loop() {
  9.   // put your main code here, to run repeatedly:
  10. }
复制代码


再三測試, delay(1), delay(2), delay(3) 都沒問題, 在 delay(4) 或以上時, 就會少了 1 ms .  有趣!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-7-7 00:12:52 | 显示全部楼层
[b]除了用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函数?
回复 支持 反对

使用道具 举报

发表于 2017-7-7 13:50:38 | 显示全部楼层
本帖最后由 Ansifa 于 2017-7-7 14:01 编辑

我最懒。。。
方法三:

void setup() {
  Serial.begin(9600);
}
void loop()
{
  if ((millis() % 4000) == 0)
  {
    Serial.println(millis() / 1000);
    delay(1);
  }
}
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|联系我们|极客工坊

GMT+8, 2026-6-13 19:12 , Processed in 0.036642 second(s), 22 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表