ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

u-blox GPS模块只输出$GxTXT无法定位?排查思路与解决指南

u-blox GPS模块只输出$GxTXT无法定位?排查思路与解决指南 最近在给一台移动机器人做 GPS 导航改造用一块基于 u-blox NEO-M8N 的模块做定位。上电后打开串口助手结果满屏都是$GxTXT开头的消息偶尔夹杂着几条看起来像报错的文本就是等不到$GNGGA和$GNRMC这种正常的定位语句。模块状态灯一直在闪RXD/TXD 也都正常天线也放到窗边了可就是死活不出定位数据。这种情况我其实不是第一次遇到。以前调 GPS 模块的时候也见过类似现象不过当时没那么严重只是偶尔输出一条$GxTXT没有像这次一样彻底刷屏。但“一直输出 $GxTXT、无法定位”这个组合确实是 u-blox 模块调试里一个很有代表性的坑把硬件和配置的疑点几乎全占了。这篇文章就按我实际排查的顺序来写先看懂消息再查硬件再查配置最后做冷启动恢复。不管你是做无人机、机器人、还是车载定位装置只要模块用的是 u-blox 系列思路都通用。1. 先把奇怪的输出看明白$GxTXT 到底是什么1.1 消息格式与常见字段解析当咱们把 USB-TTL 接上 u-blox 模块波特率设在 9600 或者 38400打开串口助手可能会看到这样的输出$GxTXT,01,01,01,ROM CORE 1.00 (59842) ROM BASE 0x10800000 FWVERHPS 1.13*62 $GxTXT,01,01,01,FIRMWARE VERSION: HPS 1.13 (82457)*51$GxTXT是标准 NMEA 协议里的“文本传输”语句专门用来传递模块自己产生的提示信息包括启动信息、固件版本、错误提示等。它的字段结构是这样的$GxTXT前缀其中 Gx 表示消息所属星座系统。GP 代表 GPSGL 代表 GLONASSGA 代表 GalileoGB 代表北斗GN 表示多星座融合消息。第 1 个字段本条文本在整组消息中的序号。比如 01 就表示这是第 1 条。第 2 个字段整组消息的总条数。通常也是 01。第 3 个字段消息类型01 一般表示错误或警告02 表示普通提示。第 4 个字段以后实际的文本内容像固件版本号或者是某些错误信息。这里要特别说明一下Gx前缀的“多星座”特性。现在新一点的 u-blox 模块比如 NEO-M8N、NEO-M9N 系列默认就是多星座输出的所以你会看到$GNTXT、$GNGGA、$GNRMC这些以 GN 开头的语句。而老一点的 NEO-6M 只支持 GPS 单星座输出的是$GPTXT、$GPGGA、$GPRMC。如果看到的是 GP 开头说明模块工作在 GPS 单系统模式这本身不是问题关键是后面有没有正常的定位语句输出。1.2 正常的上电输出长什么样正常的 u-blox 模块在掉电重启后你会在串口上看到先输出一两条$GxTXT内容一般是固件版本或者 ROM 信息然后紧接着就开始输出定位相关的 NMEA 语句。哪怕模块还没收到卫星信号输出也不会停只是语句里面的定位状态是无效的。以 NEO-M8N 为例正常启动大约是这个样子$GNTXT,01,01,01,ROM CORE 1.00 (59842)*3C $GNGGA,082126.000,,,,,0,0,,,M,,M,,*4A $GNGLL,,,,,082126.000,V,N*5F $GNGSA,A,1,,,,,,,,,,,,,,,*1E $GNRMC,082126.000,V,,,,,,,110824,,,D*55 $GNVTG,,,,,,,,,N*2E你看就算没有定位GGA 里的经纬度字段是空的RMC 里的状态是 VVoid/invalid但语句照样一条接一条往外发。这就相当于模块在跟你说“我活着但我没信号。” 而当串口里一直只有$GxTXT没有 GGA/RMC/GSV 这些结果时说明模块不是“没信号”而是“没干活”或者“配置不对”。这个区分很重要很多人排查半天其实一直在错误的方向上打转。1.3 还有一种输出反复报错的 $GxTXT如果$GxTXT的内容不是固件版本而是类似EEPROM ERROR、GPS START ERROR、NO FIX这样的文本那更要警惕。这种情况多半是模块内部 Flash 里保存的用户配置出了错或者是运行时检测到外部异常。举个实际例子有块模块在错误配置后每次上电都会先输出一行带EEPROM字样的$GxTXT然后没有任何定位语句。我一开始不懂还以为只是启动信息直到换成另一块正常模块对比才发现问题出在配置区。所以看到$GxTXT时不要直接划走先把文本内容读出来。文本里往往藏着模块自己给出的线索。如果文本是版本信息那可能只是配置问题如果文本里有 ERROR 字样那大概率是存储或者硬件层面的异常。2. 第一步排查硬件供电和天线问题往往就藏在这里2.1 供电电压、电流和纹波都要仔细看u-blox NEO 系列模块的 VCC 典型值是 3.3V不少模块设计成可以输入 5V然后板载 LDO 转成 3.3V。表面上看 5V 供电没问题但如果 LDO 的输入电压和环境温度变化大输出纹波可能会明显增大尤其在天线刚开始工作的瞬间电流冲击会把电压拉低模块就有可能在启动过程中反复重启最后表现为只输出启动文本或者干脆乱码。我建议先用手头的万用表量一下模块 VCC 对地的实际电压再看数据手册里要求的正常范围。比如 NEO-M8N 的 VCC 工作范围是 2.7V 到 3.6V如果量出来只有 2.4V那问题就很明确了。另外有条件的话尽量用示波器看一下 VCC 的纹波纹波超过 50mV 就需要注意。没有示波器也没关系如果模块电源线上并联了一个 100uF 的电解电容和 100nF 的陶瓷电容很多瞬态跌落问题能缓解不少。电流这块更关键。有些开发板的 3.3V 输出能力只有 100mA 左右GPS 模块本身的功耗虽然不高但如果接了有源天线整体电流会明显上升。有源天线内部的 LNA 一般需要 5mA 到 20mA 左右的电流不同品牌差异不小。我在测试时习惯在电源回路里串一个万用表测电流正常情况下模块加有源天线工作电流会在 50mA 到 150mA 之间波动。如果你测出来只有 1mA 以下那模块的基带基本没有工作电源和焊接要先排查。2.2 天线问题无源、有源、短路、开路天线环节是重灾区我见过太多人在这里栽跟头。GPS 天线大体分两类无源陶瓷天线内部没有放大器直接通过 RF 走线接到模块的 RF_IN 引脚。优点是便宜简单缺点是增益低对信号环境要求高在室内基本收不到星。有源天线内部带 LNA需要额外供电。常见的工作电压是 3.3V 或 5V供电通过馈线的中心导体送到天线端。有源天线增益高适合放在户外或者遮挡较多的地方也方便拉长馈线。如果你用的是有源天线但模块没有给天线供电或者模块上压根没有天线供电电路结果就是信号极弱定位很难成功。反过来如果你把有源天线接到了不支持有源天线的模块上馈线中心导体上可能长期挂着高电平运气不好还会烧掉天线内部器件。排查天线时我喜欢用万用表电阻档测馈线中心导体与屏蔽层之间的电阻。不同天线表现不一样但有以下规律无源陶瓷天线中心导体对屏蔽层应是开路状态。有源天线因为内部有 LNA中心对屏蔽会呈现类似二极管的正反电阻特性正向几百欧到几十千欧反向阻值更大。如果测出来中心对屏蔽完全短路那基本可以断定天线馈线内部破了或者天线内部短路直接换天线。如果测出来完全开路也可能说明馈线中间断了。对于有源天线还要确认供电电压正确常见的模块会在板子上标注 V_ANT 引脚有的用 3.3V有的用 5V接错轻则信号差重则烧 LNA。2.3 接线顺序和电平匹配接线这块很多刚上手的人会在 TX/RX 上打转。u-blox 模块上模块的 TX 要接单片机的 RX模块的 RX 要接单片机的 TXGND 必须共地。如果反了串口助手一类工具可能有微弱的 FIFO 数据但基本看不到正常语句。电平匹配容易被忽视。NEO-M8N 这类模块的 IO 口最高耐压一般在 3.6V 左右如果你的单片机是 5V 系统直接拿 5V TX 去驱动模块 RX轻则边沿失真导致通信质量差重则损坏模块。我见过有人把 5V Arduino 的 TX 直接接到 NEO-M8N 的 RX 上结果模块上电后一直输出启动信息后面的数据全是乱码最后加了一个双向电平转换模块才恢复。还有一个细节有些模块板载了 3.3V 稳压器可以直接接 5V 电源。但如果你是从裸模块飞线千万不要把 5V 直接怼到模块 VCC 上。请先查模块资料或者原理图确认 VCC 允许的范围再接线。3. 第二步排查用 u-center 重新梳理模块配置3.1 备份配置是动手前最重要的一步硬件检查完后下一步是借助 u-blox 官方的 u-center 工具。这个软件可以在 u-blox 官网下载Windows 版最常用。把模块通过 USB-TTL 连到电脑打开软件后在右下角选择 COM 口和波特率。默认波特率一般是 9600但如果之前有人改过你可能要逐个尝试 38400、115200 甚至 460800。连上模块之后强烈建议先把当前配置备份下来。在 u-center 里通过菜单Receiver - Configuration - Generate Configuration...可以把当前配置生成一个 .txt 或者 .xml 文件也可以通过View - Configuration View里的 CFG-CFG 功能把配置导出。为什么要备份因为后面的排查动作可能会清空配置万一模块本身没问题只是配置被我们改坏了至少还能恢复回去避免白白浪费时间。3.2 检查输出协议NMEA 是否被关闭我那块“满屏 $GxTXT”的模块最后查出来的原因就是这里的配置它的 UART1 输出协议被改成只输出 UBX 协议NMEA 输出被关闭了。模块本身并没有坏它一直很健康地工作只是把“该发的定位语句”全关了只剩下$GxTXT这种独立于协议开关的文本消息在输出。在 u-center 里检查方法是这样的打开菜单View - Configuration View快捷键 CtrlF。找到PRT配置项选择 UART1。查看Target下的Out协议。正常应该勾选UBX、NMEA、RTCM3里的至少一个做常规定位时NMEA一定要勾选。如果只勾了UBX那么串口上会出现的是二进制的 UBX 帧肉眼看着就是一堆乱码如果连UBX也关了那就只剩$GxTXT这种文本消息还能看见。这种情况的解决方案很简单把NMEA勾上点击发送让配置立即生效。然后回到串口助手你应该就能看到 GGA/RMC 语句了。但要注意如果这次改完没有保存到 Flash模块掉电重启后又会变回原来的配置所以改完后记得做保存操作。3.3 检查 GNSS 星座和工作模式u-blox 模块的多星座支持很好用但配置里一旦关掉了某些星座定位速度和能力会受影响。比如说某个模块原本开了 GPS 和北斗但后来被改掉了只留 GLONASS而你在国内测试时 GLONASS 卫星数量本来就少冷启动可能要好几分钟甚至完全悬着。打开 u-center 的GNSS配置页面可以看到当前启用星座和各星座的通道数。建议尽量开启模块支持的所有星座。NEO-M8N 支持 GPS、北斗、GLONASS、Galileo 等多星座开启后冷启动抓星会快很多。同时Assisted GNSS之类的功能可以根据需要进行配置不是必须的但很多模块默认关闭不影响本文的定位流程。模块还有几种工作模式比如“便携式”“车载”“静态”等不同模式下的动态模型和最大加速度不一样。如果你把车载模式用在低速机器人上通常问题不大反过来如果你以静态模式在高速车上测试定位效果就可能变差。默认的“便携式”模式覆盖范围最广前期调试阶段用这个模式最省心。3.4 波特率必须匹配改了要保存波特率不匹配造成的现象很迷惑打开串口助手后看到满屏乱码或者偶尔出现几个正常字符很多人会以为是接线问题。其实只要把波特率切换成模块配置的波特率数据马上就正常了。u-blox 模块默认波特率是 9600但开发板上经常被改到 115200。还有更极端的我接手过一块前同事调试过的板子波特率被改成 460800当时我试了 9600、38400、115200 都不对最后是把 460800 试出来才连上的。所以如果串口一直是乱码不要老老实实只试 9600 和 115200把常用的几个波特率全试一遍包括 460800。另外特别提醒u-blox 模块的配置是可以掉电保存的。如果你在 u-center 里改了波特率没有执行Receiver - Action - Save Config或者勾选Save on shutdown再掉电那下次上电大概率还是旧波特率。这属于“改了等于没改”的经典坑。4. 第三步排查冷启动与恢复出厂配置4.1 恢复默认配置比冷启动更彻底的清理如果硬件正常、供电正常、天线正常但模块还是只输出$GxTXT那极有可能是模块内部的非易失存储里躺着问题的配置文件。u-blox 模块支持电池供电的 RAM 保存配置也支持写入内部 Flash有些用户修改配置后掉电保存结果把 NMEA 输出或者 GNSS 星座改坏了下次上电就出现这种“能开机但没法定位”的怪现象。在 u-center 里恢复默认配置的操作路径很直接菜单Receiver - Action - Restore Default。再执行一次Receiver - Action - Cold Start让模块重新开始搜星。恢复默认配置后模块会回到出厂状态UART1 默认输出 NMEA 和 UBX 协议默认波特率是 9600GNSS 星座恢复成默认组合。如果之前的问题是配置造成的到这一步基本就能解决。有个细节要注意不同型号的默认波特率可能不一样比如部分 M8N 开发板默认 9600而有些 RTK 模块默认 115200。恢复默认配置后如果串口没输出别急着怀疑没恢复成功先确认当前波特率是不是又变回 9600 了。4.2 手动发送命令应对没有电脑的嵌入式环境实际项目里GPS 模块经常是接着单片机、树莓派或者 ROS 主机不方便搬着 u-center 到处跑。这时候可以用串口直接发 UBX 二进制命令来实现冷启动和配置恢复。一个常用的冷启动命令是 UBX-CFG-RST典型字节序列为B5 62 06 04 04 00 FF FF 00 00 0C 5D这条命令会让模块执行冷启动也就是清空当前定位状态并重新搜星。如果模块配置存放区损坏比较严重冷启动可能不生效这时可以发清除用户配置的命令 UBX-CFG-CFGB5 62 06 09 0D 00 00 00 00 00 FF FF 00 00 00 00 00 00 17 33这条命令会清除 Flash 中的用户配置下次上电时使用默认参数。不过这里必须提醒一句UBX 命令的校验和会随命令内容变化而且不同固件版本对同一命令的实现可能有差异。网上搜到的命令字节码不一定在你的模块上适用。最靠谱的办法是把模块先接到 u-center在里面手工操作一次同时用 u-center 的报文日志功能把实际发出的数据包记录下来之后就能直接拿来用。4.3 恢复后如何验证输出恢复默认配置并冷启动后模块正常工作的输出应该是这样的$GNGGA,082126.000,2231.1234,N,11356.5678,E,1,12,0.8,45.6,M,-1.2,M,,*53 $GNGLL,2231.1234,N,11356.5678,E,082126.000,A,A*4F $GNGSA,A,3,02,05,09,12,17,21,23,25,28,30,,,1.1,0.8,0.7*1F $GNRMC,082126.000,A,2231.1234,N,11356.5678,E,0.2,45.6,110824,,,D*77 $GNVTG,45.6,T,,M,0.2,N,0.3,K,A*3C如果还没有定位GGA 里的状态位会是 0 或者 VRMC 里的状态位会是 V但语句本身会一直周期性输出。所以“能看到 GGA/RMC”是模块进入正常工作的底线。至于定位成不成功那是信号和天线层面的问题。我的经验是把天线放到窗外或者楼顶冷启动之后一般 1 到 3 分钟内就能出定位如果在室内等 10 分钟没定位也很正常别因此又误判成模块故障。4.4 一个容易混淆的“软件包报错”顺带说一句调试过程中如果是在 Linux 环境里装 ROS 或者其他工具包终端里可能见过“无法定位软件包”这种报错比如无法定位软件包 ros-noetic-desktop-full。这其实是 apt 软件源配置有问题跟 GPS 的“无法定位”完全是两码事别混为一谈。GPS 这边“无法定位”指的是模块收不到足够卫星信号、算不出经纬度apt 那边的“无法定位”是仓库里没有对应安装包名称。如果看到这类报错去检查软件源列表而不是回头折腾 GPS 模块。5. 常见问题与排查技巧实录5.1 问题速查表把我在 GPS 模块调试中遇到过的典型现象、原因和解决办法整理成表方便快速对照现象可能原因解决办法只输出 $GxTXT无 GGA/RMC输出协议被改成 UBX only或 NMEA 输出被关闭用 u-center 检查 PRT 配置重新勾选 NMEA只输出 $GxTXT文本里带 ERROR模块 Flash 中配置损坏执行恢复默认 / 用 UBX-CFG-CFG 清除配置上电后没有任何输出波特率不匹配、TX/RX 接反、供电不足检查波特率与接线测量供电输出全是乱码波特率不匹配或模块 IO 被 5V 信号损坏重新匹配波特率增加电平转换输出正常但一直 V/无定位天线损坏、室内信号遮挡、有源天线未供电换天线、把模块放到窗边/室外、给天线供电放置一段时间后突然恢复首次冷启动耗时过长或所在位置遮挡严重耐心等 5-10 分钟或挪到信号好的位置电脑上定位正常接到板子不行开发板供电能力不足或板子串口接线有误加强供电检查串口接线必要时加电容输出中只有 $GxTXT无任何 NMEA 且硬复位无效模块主控异常或固件损坏尝试重新刷固件或更换模块5.2 四个值得反复强调的坑第一个坑在室内测试等于自我欺骗。GPS 信号在室内衰减极其严重混凝土墙体基本能把信号吃干净。如果模块输出正常、但一直定位失败先别怀疑模块把天线移到窗边或者户外再试。很多“无法定位”的场景其实就是测试环境不行。我见过很多新手把模块放在工位上非要它定位成功才肯继续浪费了半天时间。第二个坑模块和电脑必须共地。串口信号是以 GND 为基准的如果模块 GND 和 USB-TTL 的 GND 没有连起来看到的要不就是乱码要不就是完全没有数据。不少金属外壳的转接板会让用户误以为已经通过外壳或者其他路径接地但实际上没有。这是我的实际教训曾经在现场因为这个问题浪费了一小时。第三个坑改配置之后一定要保存到 Flash。前文反复强调过u-blox 模块的配置是“易失 非易失”双份体系。在 u-center 里改了参数默认只在 RAM 里生效掉电就没了。如果你想让配置持久化必须执行一次保存命令或者在配置窗口勾选 Save on shutdown。我自己的项目里就出现过改完配置、测试正常、然后重新上电又打回原形最后才发现是保存没有做。第四个坑有源天线供电的电压真的随板子不同而不同。有的模块 V_ANT 是 3.3V 分出来的有的是 5V 直通有的甚至需要你外接电源。买模块之前先看原理图搞清楚天线供电方式。我曾经把 5V 的天线接到 3.3V 的 V_ANT 上虽然没烧但信号一直很差最后查资料才发现供电电压不对。电压过高烧 LNA 的例子也不是没有。5.3 如果所有常规步骤都排除了还不行怎么办如果供电、天线、接线、配置、冷启动都折腾过了模块依然只输出$GxTXT那问题可能出在固件或硬件本身。这时候可以尝试用 u-center 的固件升级功能重刷模块固件先备份当前固件再确认固件版本匹配。换一块同型号的良品模块做交叉验证如果替换后一切正常那基本可以认定原模块有硬件问题。检查模块底部焊盘是否有虚焊、连锡特别是 RF_IN 附近和 VCC 引脚。有时候看起来一切正常其实是 PCB 焊点出了问题。检查有没有东西挡住了天线附近比如金属支架、大块散热片这类遮挡对 GPS 信号影响非常大。固件刷写属于有一定风险的操作。在刷写前记得退出所有占用串口的程序关闭电脑上的蓝牙和一些 GPS 辅助软件防止刷写过程中串口被抢走导致模块变砖。另外刷写期间不要断电一次失败就很可能要返厂。说实话排除定位故障这种活很多时候不是靠高深技术而是靠细致的排查顺序和好用的工具。我最深的体会是一上来就怀疑“信号不好”是最容易走弯路的方向。GPS 模块这类器件出问题时“供电”和“配置”的概率比“天线信号”高得多。如果遇到只输出$GxTXT的情况我建议按这个顺序走先看供电和接线再看输出协议和波特率最后才轮到天线和信号环境。多数问题会在前三步里就露出真相。另外一个实用小技巧调试时不要只开着串口助手发呆同时开着 u-center 看“星座图”和“定位状态”模块是收到了卫星但算不出位置还是压根没启动一眼就能分辨。希望这篇记录能帮你少走一些弯路。
返回列表