You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

WeMos D1 Mini(克隆版)运行GPS代码触发Soft WDT reset问题求助

解决WeMos D1 Mini上TinyGPSPlus+SoftwareSerial触发Soft WDT reset问题

Soft WDT reset是ESP8266看门狗超时触发的复位,核心原因是主循环(loop())被长时间阻塞,没来得及喂狗——这也是ESP8266和传统AVR Arduino的核心差异之一:AVR看门狗默认配置宽松,而ESP8266的看门狗会严格监控主循环的执行间隔(默认约1秒)。结合你的场景,问题大概率出在SoftwareSerial的特性或代码阻塞上,以下是针对性解决方案:

1. 优先替换为硬件串口(最可靠)

WeMos D1 Mini自带硬件串口Serial1(RX对应D2,TX对应D1),硬件串口无需占用CPU模拟,不会导致主循环卡顿,彻底避免看门狗问题。修改代码示例:

#include <TinyGPSPlus.h>

// 直接用硬件Serial1,无需SoftwareSerial
TinyGPSPlus gps;

void setup() {
  Serial.begin(115200); // 用于串口监视器输出
  Serial1.begin(9600);  // GPS模块的波特率,根据模块调整
}

void loop() {
  // 持续读取GPS数据,无阻塞
  while (Serial1.available() > 0) {
    gps.encode(Serial1.read());
  }

  // 定时打印GPS数据(用非阻塞方式)
  static unsigned long lastUpdate = 0;
  if (millis() - lastUpdate >= 1000) {
    lastUpdate = millis();
    if (gps.location.isValid()) {
      Serial.print("Lat: ");
      Serial.println(gps.location.lat(), 6);
      Serial.print("Lng: ");
      Serial.println(gps.location.lng(), 6);
    } else {
      Serial.println("等待GPS定位...");
    }
  }
}

接线时把GPS的TX接D2(Serial1的RX),GPS的RX接D1(Serial1的TX)即可。

2. 若必须用SoftwareSerial,优化代码避免阻塞

如果因为引脚限制必须用SoftwareSerial,需做以下调整:

  • 禁用SoftwareSerial的接收反转(默认开启会增加CPU负载):初始化时添加参数false,比如SoftwareSerial gpsSerial(D3, D4); gpsSerial.begin(9600, SWSERIAL_8N1, false);
  • 增大接收缓冲区:初始化时指定缓冲区大小,比如SoftwareSerial gpsSerial(D3, D4, false, 256);,避免数据溢出导致的阻塞
  • 绝对禁止在loop()中使用delay():改用millis()实现非阻塞延时,确保主循环能快速循环喂狗
  • 不要在函数中做长时间阻塞操作:比如不要写while(!gps.location.isValid()){}这种死循环,而是把判断逻辑放到主循环里轮询

3. 应急方案:临时禁用看门狗(不推荐)

如果只是临时调试,可以在setup()开头添加ESP.wdtDisable();禁用看门狗,但这会失去系统故障自动恢复的能力,长期使用可能导致系统不稳定,仅作为临时排查手段。

错误日志排查提示

如果错误日志里有函数调用回溯(比如PC: 0x40xxxxxx),可以通过Arduino IDE的地址映射功能,定位到具体阻塞的函数,精准解决问题。

内容的提问来源于stack exchange,提问作者OTWL

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 16:05:07