NEO-6M GPS模块与Arduino Uno通信乱码及波特率调整问题
NEO-6M GPS模块Arduino Uno读取乱码及波特率修改解决方案
问题分析
你遇到的乱码核心原因是Arduino Uno的SoftwareSerial模拟串口在115200波特率下稳定性极差——模拟串口依赖CPU中断模拟时序,高波特率下极易出现丢包、时序偏移,导致输出乱码。而TTL转换器用的是硬件串口,因此能正常读取115200波特率的GPS数据。
临时解决:用硬件串口验证GPS通信
Arduino Uno的硬件串口(Serial,对应引脚0/RX、1/TX)支持稳定的115200波特率,可先用来验证GPS数据:
接线:
- GPS模块VCC → Arduino 3.3V(NEO-6M为3.3V供电,禁止接5V)
- GPS GND → Arduino GND
- GPS TX → Arduino RX(0)
- GPS RX → Arduino TX(1)
注意:上传代码时需拔掉GPS与引脚0/1的连线,否则串口被占用会导致上传失败。
测试代码:
void setup() { Serial.begin(115200); // 与GPS默认波特率一致 } void loop() { while (Serial.available()) { Serial.write(Serial.read()); // 转发GPS数据到串口监视器 } }
上传代码后重新接好GPS连线,打开串口监视器(波特率设为115200),此时应能看到正常的NMEA数据。
永久修改GPS波特率到9600
若想改用SoftwareSerial稳定读取,需将GPS模块的波特率永久降至9600,有两种实现方法:
方法1:用TTL转换器+串口助手修改
- 用TTL转换器连接GPS模块到电脑,打开串口助手(波特率设为115200)。
- 发送以下NMEA命令到GPS模块(需包含换行回车):
$PUBX,41,1,0007,0001,9600,0*17\r\n
该命令作用:设置GPS串口波特率为9600,保存到模块永久内存(断电后不会恢复默认值)。
- 发送后重启GPS模块,将串口助手波特率改为9600,若能正常读取数据,说明修改成功。
方法2:用Arduino硬件串口发送修改命令
- 保持硬件串口接线(GPS TX→Uno RX0,GPS RX→Uno TX1),上传以下代码:
void setup() { Serial.begin(115200); delay(1000); // 发送波特率修改命令 Serial.println("$PUBX,41,1,0007,0001,9600,0*17"); delay(1000); // 切换串口波特率到9600验证 Serial.end(); Serial.begin(9600); } void loop() { while (Serial.available()) { Serial.write(Serial.read()); } }
- 打开串口监视器(先设为115200,之后改为9600),若能正常接收数据,说明修改完成。
修改后用SoftwareSerial读取的代码
波特率改为9600后,即可用SoftwareSerial稳定读取,示例代码:
#include <SoftwareSerial.h> // 定义软串口引脚,示例用2和3 SoftwareSerial gpsSerial(2, 3); // RX, TX void setup() { Serial.begin(9600); // 电脑串口监视器波特率 gpsSerial.begin(9600); // 与GPS波特率一致 } void loop() { while (gpsSerial.available()) { Serial.write(gpsSerial.read()); } }
接线:GPS TX→Uno引脚2(软串口RX),GPS RX→Uno引脚3(软串口TX),VCC和GND保持不变。
内容的提问来源于stack exchange,提问作者Divyansh undley
相关产品推荐
相关产品推荐

