TTGO T-Beam板载NEO-6M GPS波特率改115200配置求助
问题:TTGO T-Beam板载NEO-6M GPS波特率无法修改至115200
- 场景:搭建时间测量系统,默认9600波特率接收NMEA语句速度不够,需要改成115200
- 限制:GPS模块焊在板上没法直接连PC,用不了U-Center配置
- 现象:自己写的Arduino代码跑起来后,只有9600波特率能收到数据,115200完全没反馈
用户原代码
#include <SoftwareSerial.h> void setup() { Serial.begin(115200); Serial1.begin(9600, SERIAL_8N1, 34, 12); //default mode changeBaudrate(); delay(100); Serial1.flush(); Serial1.end(); } void loop() { Serial1.begin(115200, SERIAL_8N1, 34, 12); //new 115k boost mode Serial.println("try to send data with 115200"); delay(1000); while(Serial1.available()) { Serial.write(Serial1.read()); Serial1.println(); } Serial1.flush(); Serial1.end(); Serial1.begin(9600, SERIAL_8N1, 34, 12); //new 115k boost mode Serial.println("try to send data with 9600"); delay(1000); while(Serial1.available()) { Serial.write(Serial1.read()); Serial1.println(); } Serial1.flush(); Serial1.end(); } void changeBaudrate() { // CFG-PRT byte packet[] = { 0xB5, // sync char 1 0x62, // sync char 2 0x06, // class 0x00, // id 0x14, // length 0x00, // 0x01, // payload 0x00, // payload 0x00, // payload 0x00, // payload 0xD0, // payload 0x08, // payload 0x00, // payload 0x00, // payload 0x00, // payload 0xC2, // payload 0x01, // payload 0x00, // payload 0x07, // payload 0x00, // payload 0x03, // payload 0x00, // payload 0x00, // payload 0x00, // payload 0x00, // payload 0x00, // payload 0xC0, // CK_A 0x7E, // CK_B }; sendPacket(packet, sizeof(packet)); } void sendPacket(byte *packet, byte len) { for (byte i = 0; i < len; i++) { Serial1.write(packet[i]); Serial.println("in Send Packet"); } }
串口反馈
23:42:16.245 -> in Send Packet
23:42:16.245 -> in Send Packet
...
23:42:16.338 -> try to send data with 115200
23:42:17.368 -> try to send data with 9600
23:42:18.409 -> $GPRMC,,V,,,,,,,,,,N53
23:42:18.409 -> $GPVTG,,,,,,,,,N30
...
问题分析
原代码的几个致命问题:
- 指令发送后延迟太短:只等100ms,GPS模块根本来不及处理并保存配置到Flash
- 循环反复启停串口:loop里不断begin/end串口,波特率切换逻辑混乱,模块跟不上
- UBX指令校验和可能出错:手动写的校验和容易错,而且波特率编码不一定匹配NEO-6M的要求
- 数据读取逻辑错误:读取GPS数据时额外调用
Serial1.println(),干扰了正常的数据流
解决方案
1. 修正后的完整代码
#include <HardwareSerial.h> // 定义GPS串口引脚 #define GPS_RX_PIN 34 #define GPS_TX_PIN 12 void setup() { Serial.begin(115200); // 调试用串口 Serial1.begin(9600, SERIAL_8N1, GPS_RX_PIN, GPS_TX_PIN); // 用默认波特率初始化 // 发送波特率修改指令 if (setGPSBaudrate(115200)) { Serial.println("波特率修改指令发送成功"); delay(1000); // 给模块足够时间保存配置到Flash Serial1.end(); Serial1.begin(115200, SERIAL_8N1, GPS_RX_PIN, GPS_TX_PIN); // 切换到目标波特率 Serial.println("已切换至115200波特率"); } else { Serial.println("不支持该波特率,指令发送失败"); } } void loop() { // 持续读取GPS数据并输出到调试串口 while (Serial1.available()) { Serial.write(Serial1.read()); } } // 发送UBX指令修改GPS波特率 bool setGPSBaudrate(unsigned long baudrate) { // NEO-6M对应的波特率编码,只处理常用的两种 uint32_t baudCode; switch(baudrate) { case 9600: baudCode = 0x002580; break; case 115200: baudCode = 0x001C20; break; default: return false; } // CFG-PRT指令框架:配置UART1端口,8N1模式,启用NMEA输出 byte packet[] = { 0xB5, 0x62, // UBX同步字 0x06, 0x00, // 类别CFG,指令ID PRT 0x14, 0x00, // 有效载荷长度20字节 0x01, 0x00, // 端口ID:UART1 0x00, 0x00, // 预留字段 0xD0, 0x08, // 串口模式:8位数据位、无校验、1位停止位(0x08D0) (byte)(baudCode & 0xFF), (byte)((baudCode >> 8) & 0xFF), (byte)((baudCode >> 16) & 0xFF), 0x00, // 波特率编码 0xC2, 0x01, // 输入协议:NMEA+UBX 0x00, 0x07, // 输出协议:NMEA 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 // 预留字段 }; // 自动计算校验和,避免手动错误 byte ck_a = 0, ck_b = 0; for (int i = 2; i < sizeof(packet); i++) { ck_a += packet[i]; ck_b += ck_a; } // 发送完整指令包(原框架+校验和) for (int i = 0; i < sizeof(packet); i++) { Serial1.write(packet[i]); } Serial1.write(ck_a); Serial1.write(ck_b); delay(200); // 等待模块处理指令 return true; }
2. 关键修改说明
- 用
HardwareSerial替代SoftwareSerial:TTGO T-Beam的Serial1是硬件串口,稳定性比软件串口高太多 - 增加配置保存延迟:发送指令后等1秒,确保模块把配置写入Flash(掉电不丢失)
- 自动计算校验和:彻底避免手动写校验和的错误
- 简化loop逻辑:配置完成后保持115200波特率持续监听,不再反复切换
- 明确波特率编码:NEO-6M的波特率需要用特定32位值,115200对应
0x001C20
3. 验证步骤
- 把修正后的代码上传到TTGO T-Beam
- 打开Arduino串口监视器,设置波特率为115200
- 等待1秒左右,就能看到NMEA语句正常输出
- 如果还是没输出,重启一下模块,确保配置生效
内容的提问来源于stack exchange,提问作者blablabla
相关产品推荐
相关产品推荐

