ESP32连接U-blox NEO-6M GPS模块持续输出NULL的排查与解决
ESP32连接NEO-6M GPS模块后串口输出NULL的排查与修复
可能的原因及修复方案
1. 硬件连接问题
- TX/RX引脚接反:ESP32的Serial2 TX(GPIO17)必须连接NEO-6M的RX引脚,Serial2 RX(GPIO16)连接NEO-6M的TX引脚,交叉连接才能正常通信。
- 供电异常:NEO-6M仅支持3.3V供电,接入5V会烧毁模块;同时模块搜星时电流会升至几十mA,确保ESP32的3.3V引脚能提供足够电流,或改用外部3.3V电源供电。
- 天线问题:必须使用配套的有源GPS天线,且放置在开阔无遮挡的室外环境(室内搜星极慢或失败),避免天线被金属物体遮挡。
2. 串口波特率不匹配
NEO-6M默认波特率为9600,但部分模块可能被修改过参数。尝试替换Serial2.begin(9600)中的波特率为4800、38400或115200,同时确保串口监视器的波特率与Serial.begin(9600)保持一致。
3. 代码逻辑冲突
你的代码中updateSerial()函数会优先读取并转发Serial2的所有数据,导致后续gps.encode()无数据可解析。修复方式有两种:
方案一:移除冲突的updateSerial()函数
修改后的代码如下:
#include <TinyGPSPlus.h> TinyGPSPlus gps; void displayInfo() { Serial.print(F("Location: ")); if (gps.location.isValid()){ Serial.print("Lat: "); Serial.print(gps.location.lat(), 6); Serial.print(F(",")); Serial.print("Lng: "); Serial.print(gps.location.lng(), 6); Serial.println(); } else { Serial.println(F("INVALID")); } } void setup() { Serial.begin(9600); Serial2.begin(9600); delay(3000); } void loop() { // 读取GPS模块数据,同时可选转发原始NMEA语句到串口调试 while (Serial2.available() > 0) { char c = Serial2.read(); Serial.write(c); // 可选:打印原始NMEA数据,确认模块是否输出 if (gps.encode(c)) displayInfo(); } if (millis() > 5000 && gps.charsProcessed() < 10) { Serial.println(F("No GPS detected: check wiring.")); while (true); } }
方案二:修改updateSerial()函数,同时喂数据给GPS解析
如果需要保留串口转发功能,可调整updateSerial():
void updateSerial() { while (Serial.available()) { Serial2.write(Serial.read()); } while (Serial2.available()) { char c = Serial2.read(); Serial.write(c); gps.encode(c); // 同时将数据喂给TinyGPSPlus解析 } } // loop函数中仅保留updateSerial()和超时检查 void loop() { updateSerial(); if (gps.location.isValid()) { displayInfo(); } if (millis() > 5000 && gps.charsProcessed() < 10) { Serial.println(F("No GPS detected: check wiring.")); while (true); } }
额外调试步骤
如果以上修复无效,可使用USB-TTL模块直接连接NEO-6M(3.3V供电,TX/RX交叉),通过串口助手查看是否有NMEA语句输出。若没有输出,说明GPS模块本身、供电或天线存在故障;若有输出,再排查ESP32的串口配置和连接。
内容的提问来源于stack exchange,提问作者Imran Mumtaz
相关产品推荐
相关产品推荐

