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

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,,,,,,,,,N
30
...


问题分析

原代码的几个致命问题:

  • 指令发送后延迟太短:只等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. 验证步骤

  1. 把修正后的代码上传到TTGO T-Beam
  2. 打开Arduino串口监视器,设置波特率为115200
  3. 等待1秒左右,就能看到NMEA语句正常输出
  4. 如果还是没输出,重启一下模块,确保配置生效

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 08:40:19