1. 协议选型的起点为什么UBX和NMEA 0183总被放在一起比较搞嵌入式定位模块开发的人绕不开一个场景拿到一块GPS/北斗模组比如u-blox的NEO-M8N、MAX-M10S或者国产的ATGM336H第一件事就是决定让模组吐什么格式的数据给主控。这时候摆在面前的基本就两个选项——NMEA 0183和UBX。前者是几乎所有GNSS模组出厂默认输出的文本协议后者是u-blox自家的二进制协议。很多人第一次接触u-center的时候看到Messages视图里NMEA和UBX两栏并列随手勾了几个结果串口助手收到一堆乱码或者定位数据死活解析不出来问题往往就出在没搞清楚这两个协议的本质差异。这篇文章面向的是正在做嵌入式定位功能开发的工程师不管你是用STM32裸机跑串口解析还是在嵌入式Linux应用层用Python读串口只要涉及到GNSS模组的数据通信这两个协议的选择就会直接影响你的代码复杂度、CPU占用、定位精度和调试效率。我会从实际项目出发把UBX和NMEA 0183的核心区别拆开讲清楚每个区别都配上u-center里的实际操作和配置截图说明最后给出一个可以直接抄的选型决策表。先说结论性的判断如果你只是要拿经纬度、时间、速度这几个基本量NMEA 0183足够用开发成本最低如果你需要原始观测量、卫星方位角仰角、精度因子、或者要做RTK差分、做后处理那必须上UBX。但实际情况往往比这个二分法复杂很多项目是两者混用——用NMEA做快速验证用UBX做正式数据链路。下面我把这5个关键区别逐一拆解。2. 区别一数据格式与解析方式——文本行 vs 二进制帧2.1 NMEA 0183的文本行结构NMEA 0183本质上是一套ASCII文本协议每条语句以$开头以\r\n结尾字段之间用逗号分隔。最常见的是GPGGA全球定位系统定位数据和GPRMC推荐最小定位信息。一条典型的GPGGA语句长这样$GPGGA,123519,4807.038,N,01131.000,E,1,08,0.9,545.4,M,46.9,M,,*47解析这种数据你只需要按逗号split然后按位置取字段就行。用C语言写的话一个strtok循环就能搞定用Python更简单pyserial读一行line.split(,)直接出结果。这就是NMEA最大的优势——人眼可读调试零门槛。你甚至不需要写代码打开串口助手就能看到定位数据在滚动。但文本协议的代价也很明显。一条GPGGA语句大约70-80字节其中真正有用的数值信息可能只占一半其余都是逗号和字母标识。如果模组每秒输出5条NMEA语句GGA、RMC、GSA、GSV、VTG波特率9600的情况下串口带宽占用相当可观。更麻烦的是GSV语句卫星信息多的时候一条装不下会拆成多条解析逻辑要处理这种分片情况。2.2 UBX的二进制帧结构UBX完全是另一套逻辑。它的每一帧都是二进制结构固定字段长度说明Sync Char 11字节固定0xB5Sync Char 21字节固定0x62Class1字节消息类别如0x01表示NAVID1字节消息ID如0x02表示POSLLHLength2字节载荷长度小端Payload变长实际数据CK_A1字节校验和ACK_B1字节校验和B以UBX-NAV-POSLLH0x01 0x02为例它的载荷是28字节里面直接是int32类型的经纬度单位1e-7度、海拔毫米、精度估计等。没有逗号没有字母标识全是紧凑的二进制数值。解析UBX需要你按字节流处理先找同步头0xB5 0x62再读Class和ID判断是什么消息然后读Length确定载荷长度最后校验CK_A和CK_B。校验算法是8位 Fletcher校验不难但必须写对否则数据错了你都不知道。注意UBX的Length字段是小端序但载荷内部的数值字段可能是小端也可能是大端取决于具体消息定义。比如NAV-POSLLH里的经纬度是int32小端但有些消息里的浮点数是IEEE 754小端。写解析代码前一定要对着u-blox的Interface Description文档确认字节序。2.3 解析复杂度对比与实操建议从代码量上看NMEA解析可能50行搞定UBX解析至少200行起步含校验和状态机。但从运行时效率看UBX完胜——同样传输定位信息UBX-NAV-POSLLH一帧只要36字节含帧头帧尾而NMEA的GGARMC组合至少140字节。在波特率受限或者需要高频输出的场景下这个差距会直接决定你能不能跑到10Hz以上的更新率。我的实操建议是原型验证阶段用NMEA正式产品根据需求切换。在u-center里切换输出协议很简单打开View - Messages View在NMEA栏取消勾选不需要的语句在UBX栏勾选NAV-POSLLH等消息然后点击Send。如果你想彻底关掉NMEA只留UBX需要发一个UBX-CFG-PRT消息把串口的输出协议设为只有UBX。这个操作在u-center的Configuration View里也能做Protocol选UBX然后勾选对应的输入输出协议。3. 区别二信息密度与可用数据范围——基础定位 vs 全量观测量3.1 NMEA能给你什么NMEA 0183的标准语句集覆盖了绝大多数常规定位需求GPGGA时间、纬度、经度、定位质量、卫星数、HDOP、海拔GPRMC时间、日期、经纬度、速度、航向GPGSA当前使用的卫星PRN、PDOP、HDOP、VDOPGPGSV可见卫星的PRN、仰角、方位角、信噪比GPVTG地面速度、航向这些数据对于车载导航、轨迹记录、时间同步这类应用完全够用。但如果你要做的事涉及到原始测量值比如载波相位、伪距、多普勒频移NMEA就无能为力了。NMEA的定位结果是模组内部解算完的“成品”你拿不到“原料”。3.2 UBX能给你什么UBX的消息类别覆盖了GNSS接收机的全部内部状态。常用的几类UBX-NAV-*导航解算结果包括POSLLH经纬高、VELNED速度、SAT卫星状态、DOP精度因子、PVT位置速度时间综合UBX-RXM-*原始测量数据包括RAW伪距、载波相位、多普勒、SFRBX子帧原始数据UBX-CFG-*配置消息用来设置更新率、动态模型、端口协议等UBX-MON-*监控消息包括硬件状态、通信统计、射频干扰其中UBX-RXM-RAWX是RTK和后处理应用的核心。它输出的每条卫星观测记录包含伪距、载波相位、多普勒、载噪比这些是做差分定位的必备输入。NMEA里完全没有对应的数据。3.3 信息密度差异的实际影响我做过一个对比测试同一块NEO-M8N模组分别用NMEA和UBX输出波特率都设115200看每秒能传多少有效信息。对比项NMEA 0183UBX单次定位数据量GGARMC约140字节NAV-PVT约92字节卫星详细信息GSV分片多颗星时超200字节NAV-SAT约812×N字节原始观测量不支持RAWX每颗星约32字节10Hz更新率下带宽约14KB/s约9KB/s含RAWX则更高可解析字段数约30个超过100个这个表说明一个问题UBX在同等带宽下能承载的信息量远大于NMEA。如果你的应用需要高频输出且要卫星级细节NMEA的GSV分片机制会让你很头疼——卫星数超过4颗就要拆多条解析代码得维护一个状态机来拼接。实操心得在u-center里查看RAWX数据需要先发UBX-CFG-MSG把RXM-RAWX打开。默认情况下这个端口是不输出RAWX的因为数据量太大。打开后你会看到Messages View里RAWX的计数在涨但如果你用串口助手直接看全是二进制乱码必须用u-center的Packet Console或者自己写解析工具才能读。4. 区别三配置与控制能力——只读输出 vs 双向交互4.1 NMEA的被动性NMEA 0183在设计上是一个“输出协议”。模组通过串口往外吐语句主控只管接收解析。你当然可以通过发特定的NMEA命令来配置模组比如$PUBX,40或者厂商私有的$PCAS命令但这些命令的标准化程度很低不同厂商、不同型号之间不通用。u-blox模组虽然支持一些NMEA配置命令但功能远不如UBX-CFG全面。换句话说NMEA模式下你对模组的控制力很弱。你没法通过NMEA设置动态模型比如车载、步行、飞行没法调整导航更新率没法配置RTK模式没法读取硬件状态。这些操作全部要走UBX-CFG消息。4.2 UBX的完整配置体系UBX-CFG是u-blox模组的配置核心。常用的配置消息包括CFG-PRT设置串口波特率、输入输出协议CFG-RATE设置测量周期和导航更新率CFG-NAV5设置动态模型、固定高度、2D/3D模式CFG-GNSS设置启用哪些星座GPS、GLONASS、Galileo、北斗CFG-MSG设置每个端口输出哪些消息、输出频率CFG-TMODE3设置RTK基准站或流动站模式这些配置在u-center里都有图形界面。比如设置更新率到10Hz打开Configuration View选CFG-RATE把Measurement Period设为100msNavigation Rate设为1然后Send。模组会返回一个ACK-ACK确认如果配置不合法会返回ACK-NAK。4.3 配置持久化与掉电保存这里有一个很多人踩过的坑UBX配置默认在掉电后丢失。你通过CFG-MSG设置了输出消息断电再上电模组又回到出厂默认状态。要保存配置必须发送UBX-CFG-CFG消息选择保存到BBR电池备份RAM、Flash还是EEPROM。在u-center里的操作是Configuration View - CFG-CFG勾选Save current configuration选择对应的存储设备0BBR1Flash2EEPROM4RAM然后Send。不同模组的存储能力不同NEO-M8N有FlashMAX-M10S只有RAM和BBR掉电时间长了BBR也会丢。注意频繁写Flash会缩短寿命一般只在配置确定后写一次。开发阶段建议存BBR量产固件里再写Flash。5. 区别四精度与定位模式支持——单点 vs RTK与原始数据5.1 NMEA的精度天花板NMEA输出的定位精度取决于模组内部的解算结果。单点定位下普通GNSS模组的水平精度在2-3米CEP左右加了SBAS能到1-2米。NMEA的GGA语句里有HDOP字段可以粗略判断当前精度但仅此而已。你拿不到载波相位做不了厘米级定位。5.2 UBX对RTK的支撑RTK实时动态差分需要基准站和流动站之间传输原始观测量或差分改正数。u-blox的RTK方案里基准站通过UBX-RXM-RAWX输出原始观测或者通过UBX-RXM-SFRBX输出导航电文然后由外部处理器比如嵌入式Linux上的RTKLIB计算差分改正再通过UBX-RXM-EPH或者RTCM消息发给流动站。流动站收到改正数后内部RTK引擎解算出厘米级位置再通过UBX-NAV-PVT或NMEA的GGA输出。整个链路里NMEA只在最后输出结果时出现中间的原始数据传输全靠UBX。如果你想用u-blox模组做RTKUBX是必选项没有替代方案。5.3 精度因子与卫星状态的可观测性UBX-NAV-DOP消息直接给出几何精度因子、水平精度因子、垂直精度因子、时间精度因子比NMEA的GSA语句更完整。UBX-NAV-SAT给出每颗可见卫星的方位角、仰角、载噪比、锁定状态比NMEA的GSV更详细且不分片。这些数据在做多传感器融合的时候很有用。比如你在做组合导航需要根据卫星几何分布动态调整GNSS的权重UBX-NAV-DOP和NAV-SAT提供的信息比NMEA丰富得多。6. 区别五调试与开发效率——u-center实操对比6.1 u-center里的NMEA调试u-center连接模组后默认就是NMEA模式。Text Console里能看到滚动的NMEA语句Packet Console里能看到解析后的字段值。如果你想看某个字段的变化趋势可以打开View - Docking Windows - Data View选GGA然后看Latitude、Longitude、Altitude的实时数值。NMEA调试的最大好处是所见即所得。串口助手收到什么u-center里就显示什么不需要额外的解析工具。如果你在写嵌入式代码可以直接把串口助手收到的NMEA语句复制到代码里做单元测试输入输出完全确定。6.2 u-center里的UBX调试UBX调试需要多一步操作在Messages View里勾选你要看的UBX消息然后Send。勾选后Packet Console里会出现对应的消息条目点开能看到每个字段的十六进制和十进制值。如果你想看NAV-PVT的详细内容双击Packet Console里的PVT条目会弹出一个窗口显示所有字段。UBX调试的难点在于二进制不可读。如果你用串口助手直接看只能看到B5 62开头的乱码。要验证你的解析代码是否正确可以用u-center的Export功能把Packet Console里的消息导出成文本然后跟你的代码输出对比。6.3 混合模式的调试技巧实际项目里最常见的配置是NMEA和UBX同时输出。比如让模组在串口1输出NMEA给主控做快速定位同时在串口2输出UBX给另一个处理器做RTK。或者同一个串口上NMEA和UBX交替输出主控根据同步头区分。在u-center里配置混合输出Messages View里同时勾选NMEA的GGA、RMC和UBX的NAV-PVT设置不同的输出频率。比如NMEA 1HzUBX 5Hz。这样主控可以用NMEA做低频监控用UBX做高频控制。实操心得混合输出时要注意带宽。如果波特率只有9600同时开NMEA和UBX很容易丢数据。建议至少115200起步或者用UBX-CFG-PRT把波特率调高。调波特率的时候先改模组再改u-center否则会失联。具体操作Configuration View - CFG-PRT选UART1把Baudrate改成115200Send然后立刻在u-center的Receiver - Port里把波特率也改成115200重新连接。7. 选型决策表与常见问题排查7.1 一张表帮你做决定需求场景推荐协议理由快速验证模组是否工作NMEA串口助手直接可读车载导航、轨迹记录NMEAGGARMC足够开发快时间同步PPSUTCNMEA或UBXNMEA的RMC有UTCUBX的PVT有纳秒时间高频控制5HzUBX带宽效率高延迟低RTK差分定位UBX必须用RAWX/SFRBX多传感器融合UBXDOP和SAT信息更全低功耗休眠唤醒UBX配置和状态读取更灵活兼容老设备NMEA工业标准通用性强7.2 常见问题速查问题一u-center连上了但看不到数据。检查波特率是否匹配检查View - Messages View里对应协议的消息是否勾选。如果之前发过CFG-PRT把协议关了需要重新发一条CFG-PRT把协议打开。问题二UBX解析出来全是0或者乱码。先确认字节序再确认校验和是否正确。校验和算错的话数据字段的偏移会全部错位。建议先用u-center导出一段已知正确的UBX数据用你的解析代码跑一遍对比每个字段。问题三NMEA的GSV语句卫星数对不上。GSV是分片传输的第一条的第三个字段是总条数第四条是当前条数。解析时要先读总条数再循环读所有分片最后合并。问题四配置保存后重启又丢了。确认是否发了CFG-CFG保存命令确认存储介质是否支持掉电保存。BBR需要VBAT引脚有电如果VBAT没接电池掉电后BBR也会丢。问题五同时开NMEA和UBX后数据丢包。降低输出频率或者提高波特率。也可以用CFG-MSG把不需要的消息关掉只留核心的几条。7.3 我的个人经验踩过几次坑之后我现在的习惯是新项目先用NMEA跑通硬件链路确认模组、天线、供电都没问题然后切到UBX做正式开发。切换的时候不要一次性把所有NMEA都关掉留一条GGA做备份监控万一UBX解析出问题还能用GGA确认模组本身是好的。另外u-center的Configuration View里有一个“Send”按钮每次改配置都要点一下才生效。很多人改了参数没点Send以为已经配置好了结果模组还是按老参数跑。这个按钮的位置在Configuration View的底部不太显眼但很关键。最后分享一个快速判断模组是否支持UBX的方法在u-center里打开Messages View如果UBX栏是灰色的或者勾选后没有数据返回说明这个模组可能不是u-blox芯片或者固件被裁剪了。国产的ATGM336H、中科微的AT6558这些模组虽然也输出NMEA但UBX协议不一定完整支持选型时要确认清楚。
企业数字化 ERP 产品动态
相关推荐
Mailcow邮件服务器部署实战:用Docker Compose打造自建邮箱系统 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 4:55:23
电商资料包合规审核MaaS实战:双模型协同与多模态风控 1. 项目概述:一场电商资料包核验效率的“外科手术式”改造你有没有遇到过这种场景:每天上午十点,运营同事准时把一摞PDF塞进你邮箱——某平台新上架的50个商品资料包,要求当天完成合规性初筛。每个包里至少含3份文件:主… · 2026/9/25 4:55:22
Verilog仿真自动纠错配置:VSCode+iverilog+GTKWave一体化环境搭建 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 4:55:16
Protractor 端到端测试基础设施架构深度解析:从组件到进程通信的全链路 测试 【免费下载链接】protractor E2E test framework for Angular apps 项目地址: https://gitcode.com/gh_mirrors/pr/protractor 点击查看 免费下载 导读
本篇文章以 Protractor 官方文档《How It Works / Infrastructure》为骨架,结合仓库源码与配… · 2026/9/25 5:54:20
昇腾Atlas 300V部署YOLOv5全流程实战:从模型转换到推理调优 Atlas这个词放在AI部署圈里,通常不是一个地图软件,而是指华为昇腾(Ascend)系列的AI计算平台。很多人第一次接触Atlas,是因为手头拿到了一块Atlas 300V 24G的运算加速卡,想拿它跑YOLO目标检测。问题往往从这… · 2026/9/25 5:54:08
Cocos Creator微信小游戏开发闭环指南 1. 为什么一个真实运行的“一人工作室”需要这套闭环指南我从2019年开始用Cocos Creator做微信小游戏,前三年接外包、做定制、带小团队,踩过所有你能想到的坑——打包失败、真机白屏、内存爆表、审核被拒、上线后卡顿掉帧。直到2023年彻底转型为纯一人工… · 2026/9/25 5:54:01
Atlas 300V部署YOLO实战:昇腾推理卡全流程解析与避坑指南 做AI部署这一行的人,但凡接触过边缘计算和推理加速,基本绕不开“atlas”这个名字。昇腾Atlas系列硬件这几年在安防、工业质检、自动驾驶、智慧零售这些场景里出镜率极高,尤其是配合YOLO系列目标检测模型做边缘端部署,几乎是标配方… · 2026/9/25 5:54:01
词达人自动答题脚本:浏览器自动化与题库匹配实战 1. 词达人自动答题脚本的底层逻辑与设计思路1.1 这个脚本到底解决什么问题词达人这类词汇学习平台,核心机制其实不复杂:给定一个英文单词,从四个中文释义里选正确的;或者反过来,给中文选英文。题目本身不难,… · 2026/9/25 5:54:01
创维E900V22D刷机全攻略:S905L3SB芯片兼容性解析与救砖实战 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 1:00:31
MQTT协议原理与Broker服务器搭建实战:从Mosquitto到EMQX /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 1:00:37