C语言 Arduino创建延迟函数



我正在尝试制作自己的延迟函数。简单地说,mydelay函数每secs秒调用一次toggled函数。代码写得不好,我知道(这是第一个版本)。但我只是想让它正常工作。然后我会重构它。但是我有一些意想不到的bug。第一次循环在x功能工作正常。它打印"我在while"1秒,然后它打印"我结束我的延迟",这是我想要的行为。但在x完成循环后。第二次是循环的时候。它进入mydelay函数(没问题)。但它并没有打印"I am in while"。它只是打印"我正在结束我的延迟",这是不好的。

代码如下:

#include <Arduino.h>
int led = 7;
void setup() {
  Serial.begin(9600);
  pinMode(led, OUTPUT);
}
void loop() {
  x();
  Serial.println("Im ending main loop");
}
void x() {
  for (int i = 0; i <= 10; i++) {
    mydelay(led, 0, 1);
    mydelay(led, 1, 1);
  }
}
void mydelay(int pin, int hol, int secs) {
  int starttime = millis();
  while ((millis() - starttime) <= (secs * 1000)) Serial.println("I am in while");
  toggled(pin, hol);
  Serial.println("Im ending mydelay");
}
void toggled(int pin, int hol) {
  digitalWrite(led, hol);
}

int starttime = millis();更改为unsigned long starttime = millis();。这个可能是问题所在,因为如果您使用的是int,那么您的程序将在32秒后疯狂运行。这是一个问题,因为int只能保存从-32,768到32,767的数字。

还有,你不妨试试这个:

while ((millis() - starttime) <= (secs * 1000))
{
  Serial.println("I am in while");
}

也许你可以尝试重置millis使用这样的东西,我没有arduino所以它没有测试,但希望它能帮助。

extern volatile unsigned long timer0_millis;
unsigned long reset = 0;
#include <Arduino.h>
int led = 7;
void setup() {
  Serial.begin(9600);
  pinMode(led, OUTPUT);
}
void loop(){
  x();
  Serial.println("Im ending main loop");
  setMillis(reset);
}
void setMillis(unsigned long new_millis){
  uint8_t oldSREG = SREG;
  cli();
  timer0_millis = new_millis;
  SREG = oldSREG;
}
void x() {
  for (int i = 0; i <= 10; i++) {
    mydelay(led, 0, 1);
    mydelay(led, 1, 1);
  }
}
void mydelay(int pin, int hol, int secs) {
  int starttime = millis();
  while ((millis() - starttime) <= (secs * 1000)) Serial.println("I am in while");
  toggled(pin, hol);
  Serial.println("Im ending mydelay");
}
void toggled(int pin, int hol) {
  digitalWrite(led, hol);
}

最新更新