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
相关产品推荐
相关产品推荐

