Arduino与GY-NEO-6Mv2交互:displayInfo()重复输出及setup()无输出问题
解决TinyGPS++ displayInfo()重复输出及setup()无输出问题
嘿,我看你在用TinyGPS++和SoftwareSerial的时候碰到了两个棘手的问题:displayInfo()在循环里不停重复输出相同字符串,把代码移到setup()里又啥都打不出来。这俩问题其实都是和Arduino的执行逻辑以及GPS模块的工作特性有关,我来给你拆解下并搞定它。
为啥会出现这俩问题?
重复输出的根源:
Arduino的loop()函数是不停循环执行的,要是你每次循环都调用displayInfo(),但GPS模块的定位数据更新频率一般只有1次/秒,远赶不上loop()的执行速度。结果就是每次循环都打印旧的、还没更新的数据,看起来就像一直在重复输出。setup()里没输出的原因:
setup()只在Arduino上电后跑一次,这时候GPS模块还没和卫星完成握手,根本没接收到任何有效定位数据。你这时候调用displayInfo(),TinyGPS++对象里的所有数据都是空的,自然啥都打不出来。
修复后的完整代码
我给你调整了代码,核心就是只在GPS有新数据时才打印,同时确保持续读取GPS串口的数据让解析正常工作:
#include <TinyGPS++.h> #include <SoftwareSerial.h> static const int RXPin = 12, TXPin = 13; static const uint32_t GPSBaud = 9600; TinyGPSPlus gps; SoftwareSerial ss(RXPin, TXPin); void setup() { Serial.begin(9600); ss.begin(GPSBaud); Serial.println("正在等待GPS定位,请稍候..."); } void loop() { // 持续读取GPS串口的每一个字节,这是TinyGPS++解析数据的关键步骤 while (ss.available() > 0) { gps.encode(ss.read()); // 只有当GPS获取到新的位置数据时,才调用displayInfo打印 if (gps.location.isUpdated()) { displayInfo(); } } } void displayInfo() { Serial.print("纬度: "); gps.location.isValid() ? Serial.print(gps.location.lat(), 6) : Serial.print("无效"); Serial.print(" | 经度: "); gps.location.isValid() ? Serial.print(gps.location.lng(), 6) : Serial.print("无效"); Serial.print(" | 卫星数: "); gps.satellites.isValid() ? Serial.print(gps.satellites.value()) : Serial.print("无效"); Serial.println(); }
关键改动说明
- 新增数据更新判断:用
gps.location.isUpdated()检查是否有新的位置数据,只有更新时才打印,彻底解决重复输出的问题 - 持续读取串口数据:
while (ss.available() > 0)确保不会漏掉GPS模块发来的任何数据,让TinyGPS++能正确解析定位信息 - 有效性检查:在打印每个数据项前用
isValid()判断,避免输出无效的空数据
额外小提示
- 如果你想在时间、海拔等其他数据更新时也打印,可以对应使用
gps.time.isUpdated()、gps.altitude.isUpdated()这类判断 - GPS首次定位可能需要1-5分钟(室内更久),给模块接个有源外置天线能大幅加快定位速度
内容的提问来源于stack exchange,提问作者Nishant Agarwala
相关产品推荐
相关产品推荐

