首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何知道一个Arduino是否由于WDT超时而重新启动?

如何知道一个Arduino是否由于WDT超时而重新启动?
EN

Stack Overflow用户
提问于 2020-11-25 23:49:16
回答 1查看 463关注 0票数 1

我有Arduino代码,在其中我实现了一个8秒的看门狗。为了进行测试,我放置了一个for循环,一切都正常工作。

我想知道在Arduino中发生看门狗超时时是否可以打印消息,特别是我要做的是在由监视狗引起的重置发生时由XBee发送消息。我已经有了XBee逻辑,我怎么知道何时会发生这种重置?

我已经尝试过这里提出的解决方案,但对我来说不管用:

链接

我的代码:

代码语言:javascript
复制
#include <avr/wdt.h>
void setup() {
  Serial.begin(9600);
  Serial.println("turning on");
  delay(1000);
  watchdogsetup();
}

void loop() {
 for (int i = 0; i <= 9; i++) {
      Serial.println();
      delay(1000);
 }  //Test to activate watchdog

       //My code ....
       //....

 wdt_reset();    // reset the watch dog to zero
}
EN

回答 1

Stack Overflow用户

发布于 2020-11-27 13:04:43

只是个主意。

当看门狗触发时,不确定通过XBee发送消息所需的时间和资源是否仍然可用,因此该消息最好是在Arduino重置并再次正常运行之后发送。

我认为,看门狗定时器确实设置了一个标志,该标志可以从重置本身中幸存下来,但是引导加载程序会清除它,因此,如果使用引导加载程序,信息就会丢失。

因此,您需要设置自己的标志,并在Arduino重置后读取该标志。您可以尝试编写一个中断处理程序,并添加一些其他东西来将标志写入EEPROM,如下所示(未经测试):

代码语言:javascript
复制
#include <EEPROM.h>
int addr = 0; // Or whatever EEPROM address you like

setup() {
  if (EEPROM.read(addr) == 1) {          //If a WDT flag was set
    // Send panicky message by XBee here
  }
  EEPROM.write(addr, 0);                 // Reset the WDT flag
  // Rest of setup() goes here
}

ISR(WDT_vect) {
  EEPROM.write(addr, 1);                 // Set the WDT flag
}

..。并希望Arduino没有崩溃,除了能够写信给EEPROM时,看门狗开火。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65014277

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档