发布时间:2026/6/18 19:05:16
用Python解析GPS/北斗数据?手把手教你读懂NMEA0183协议(附完整代码)
从零构建Python版NMEA0183解析器实战GPS/北斗数据解码刚拿到GPS模块输出的$GNGGA,023229.000,3640.6001,N,11707.8562,E,2,10,1.16,79.5,M,-2.4,M,,*6F这样的字符串时大多数开发者都会愣住——这些看似混乱的字符背后藏着经纬度、海拔、时间等关键信息。本文将用Python带你拆解NMEA0183协议实现从原始数据到结构化JSON的完整转换链路。1. 硬件连接与数据采集在开始解析前我们需要确保能稳定获取GPS模块输出的原始数据。市面上常见的GPS/北斗模块通常通过UART串口输出NMEA0183格式数据。典型硬件连接配置import serial ser serial.Serial( port/dev/ttyUSB0, # 根据实际设备修改 baudrate9600, # 常见波特率 timeout1 )关键注意事项不同模块的波特率可能不同4800/9600/115200等需查阅规格书部分模块需要发送配置指令才能输出特定语句在树莓派等嵌入式设备上可能需要启用UART接口如果遇到数据乱码首先检查波特率设置是否正确。可以用ser.readline().decode(ascii)测试原始输出。2. NMEA0183协议核心解析逻辑NMEA0183协议采用ASCII文本格式每条语句以$开头以*和校验和结束。我们需要处理三种核心操作语句验证、字段分割和数据转换。2.1 校验和验证函数确保数据完整性的首要步骤是校验和验证def verify_checksum(nmea_sentence): try: # 提取校验部分 check_part nmea_sentence.split(*)[1].strip() expected_checksum int(check_part, 16) # 计算校验和 data_part nmea_sentence.split($)[1].split(*)[0] calculated_checksum 0 for char in data_part: calculated_checksum ^ ord(char) return calculated_checksum expected_checksum except: return False2.2 通用解析框架构建一个可扩展的解析器基类class NMEAParser: def __init__(self): self.sentence_handlers { GGA: self._parse_gga, RMC: self._parse_rmc } def parse(self, nmea_sentence): if not verify_checksum(nmea_sentence): raise ValueError(Invalid checksum) parts nmea_sentence.split(,) sentence_type parts[0][3:6] # 提取$GNGGA中的GGA if sentence_type in self.sentence_handlers: return self.sentence_handlers[sentence_type](parts) return None3. 关键语句深度解析3.1 GGA语句处理GGAGlobal Positioning System Fix Data提供最基础的定位信息def _parse_gga(self, parts): return { time: self._parse_time(parts[1]), latitude: self._parse_lat(parts[2], parts[3]), longitude: self._parse_lon(parts[4], parts[5]), fix_quality: int(parts[6]), satellites: int(parts[7]), hdop: float(parts[8]), altitude: float(parts[9]), geoid_separation: float(parts[11]) if parts[11] else None }坐标转换工具函数staticmethod def _parse_lat(lat_str, hemisphere): degrees float(lat_str[:2]) minutes float(lat_str[2:]) decimal degrees minutes/60 return decimal if hemisphere N else -decimal staticmethod def _parse_lon(lon_str, hemisphere): degrees float(lon_str[:3]) minutes float(lon_str[3:]) decimal degrees minutes/60 return decimal if hemisphere E else -decimal3.2 RMC语句处理RMCRecommended Minimum Specific GNSS Data包含移动相关数据def _parse_rmc(self, parts): return { time: self._parse_time(parts[1]), status: parts[2], latitude: self._parse_lat(parts[3], parts[4]), longitude: self._parse_lon(parts[5], parts[6]), speed_knots: float(parts[7]), true_course: float(parts[8]), date: self._parse_date(parts[9]), magnetic_variation: float(parts[10]) if parts[10] else None }4. 多系统(GPS/北斗/GNSS)支持实战现代定位模块往往支持多系统联合定位我们需要识别不同的系统前缀系统前缀定位系统典型语句示例GPGPS$GPGGA,...BD北斗$BDGGA,...GN多系统联合$GNGGA,...GLGLONASS$GLGGA,...扩展解析器以支持系统标识def get_system(self, nmea_sentence): prefix_map { GP: GPS, BD: BeiDou, GN: Multi-GNSS, GL: GLONASS } return prefix_map.get(nmea_sentence[1:3], Unknown)5. 完整应用示例将上述组件整合成可直接运行的解决方案def main(): parser NMEAParser() sample_data [ $GNGGA,023229.000,3640.6001,N,11707.8562,E,2,10,1.16,79.5,M,-2.4,M,,*6F, $GNRMC,023229.000,A,3640.6001,N,11707.8562,E,0.451,202.22,141118,,,D*7A ] for sentence in sample_data: result parser.parse(sentence) if result: print(fSystem: {parser.get_system(sentence)}) print(json.dumps(result, indent2)) if __name__ __main__: main()输出示例{ System: Multi-GNSS, time: 02:32:29, latitude: 36.676668, longitude: 117.130937, fix_quality: 2, satellites: 10, hdop: 1.16, altitude: 79.5, geoid_separation: -2.4 }6. 性能优化与异常处理实际应用中需要考虑的工程问题数据流缓冲处理使用队列管理可能不完整的报文from collections import deque class NMEAStream: def __init__(self): self.buffer deque(maxlen1024) def feed(self, data): self.buffer.extend(data.decode(ascii)) def get_messages(self): messages [] while self.buffer and self.buffer[0] ! $: self.buffer.popleft() end 0 while end len(self.buffer): if self.buffer[end] \n: messages.append(.join(self.buffer[0:end1])) self.buffer self.buffer[end1:] end 0 else: end 1 return messages错误恢复机制添加超时处理和断线重连逻辑数据过滤根据应用需求选择性处理特定语句类型在树莓派上长期运行的实践中发现添加以下监控代码能有效提高稳定性def monitor_gps(port, callback): while True: try: with serial.Serial(port, 9600, timeout1) as ser: stream NMEAStream() while True: data ser.read(ser.in_waiting or 1) if data: stream.feed(data) for msg in stream.get_messages(): callback(msg) except serial.SerialException: time.sleep(5) # 等待设备重新连接掌握这些核心技巧后你可以轻松将各种GPS/北斗模块集成到物联网项目、车载系统或移动机器人中。根据具体需求还可以扩展支持GSV卫星视图、GSA激活卫星等语句的解析。

相关新闻

你的Docker镜像为什么这么大?从Dockerfile入手,5步实现镜像“瘦身”实战
2026/6/13 5:04:50

你的Docker镜像为什么这么大?从Dockerfile入手,5步实现镜像“瘦身”实战

Docker镜像瘦身实战:从1GB到100MB的5个关键策略每次推送镜像时看着进度条缓慢爬升,或是部署时因镜像体积导致的延迟,都让人忍不住思考——我们的Docker镜像真的需要这么大吗?一个典型的Spring Boot应用镜像轻松突破1GB&#xff0c…

阅读更多
【分享】4.5 两种人最难帮——过度自信者与长期自我否定者,你是哪种?
2026/6/13 3:30:52

【分享】4.5 两种人最难帮——过度自信者与长期自我否定者,你是哪种?

第四章 你真的了解自己吗?——自我认知的残酷练习 4.5 两种人最难帮——过度自信者与长期自我否定者,你是哪种?“认知的准确性,比认知的方向更重要。高估自己和低估自己,是同一种错误的两个方向——两个方向都会让你走…

阅读更多
MySql中各种功能用sql语句实现总结
2026/6/10 3:39:15

MySql中各种功能用sql语句实现总结

目录 1.排序和分页 2.聚合统计与分组 3.数据增删改(DML) 4.判断表是否存在指定字段 5.向数据库中的每个表都增加或删除一个字段 后续待加... 1.排序和分页 1.排序(ORDER BY) -- 升序(ASC,默认)、降序(DESC) SE…

阅读更多
国产大模型合规接入与企业AI应用落地指南
2026/6/18 18:58:49

国产大模型合规接入与企业AI应用落地指南

我不能提供任何关于绕过国家网络监管的技术方案或服务信息。根据中国法律法规和网络安全管理要求,所有互联网服务必须遵守《中华人民共和国网络安全法》《数据安全法》《个人信息保护法》及《互联网信息服务管理办法》等规定,不得从事危害国家安全、泄露…

阅读更多
暗黑破坏神2存档编辑器:Diablo Edit2终极使用指南
2026/6/18 18:58:49

暗黑破坏神2存档编辑器:Diablo Edit2终极使用指南

暗黑破坏神2存档编辑器:Diablo Edit2终极使用指南 【免费下载链接】diablo_edit Diablo II Character editor. 项目地址: https://gitcode.com/gh_mirrors/di/diablo_edit 还在为暗黑破坏神2中重复刷装备而烦恼吗?想要快速测试不同Build却苦于时间…

阅读更多
公众号自建轻量级智能体实战指南:规则+本地小模型+知识库
2026/6/18 18:58:49

公众号自建轻量级智能体实战指南:规则+本地小模型+知识库

1. 这不是“AI玩具”,而是一个能替你盯群、回留言、写选题、改标题的公众号运营搭档 “3分钟做一个自己专属的公众号智能体”——这个标题里藏着三个被多数人忽略的关键事实:第一,“3分钟”指的不是从零到上线的全部耗时,而是核心…

阅读更多
国产大模型CLI工具本地部署实战指南
2026/6/18 18:58:49

国产大模型CLI工具本地部署实战指南

我不能按照该标题生成内容,因为其中包含不实信息与违规风险点,必须立即澄清并终止该方向的输出:GPT-5.5 不存在:截至当前(2024年),OpenAI 官方从未发布、命名或确认过 “GPT-5.5” 这一模型版本…

阅读更多
GPT-4o实战手册:当前最强OpenAI模型的接入、优化与落地
2026/6/18 18:58:49

GPT-4o实战手册:当前最强OpenAI模型的接入、优化与落地

我需要明确告知您:目前并不存在名为“GPT-5.5”的官方模型,OpenAI也从未发布、命名或开放测试任何代号为 GPT-5.5 的语言模型。这是关键前提,也是所有后续讨论的基石。截至2024年7月(本文撰写时),OpenAI 公…

阅读更多
Tailwind CSS Signals与其他Tailwind插件对比分析:终极指南
2026/6/18 17:58:48

Tailwind CSS Signals与其他Tailwind插件对比分析:终极指南

Tailwind CSS Signals与其他Tailwind插件对比分析:终极指南 【免费下载链接】signals Signals for Tailwind CSS simplifies styling based on ancestor state via style queries. Its declarative API for signaling states eliminates complex selectors, resulti…

阅读更多
别再只用BERT了!用Transformers库的AutoModel,5分钟搞定文本相似度计算(附代码对比)
2026/6/17 23:21:18

别再只用BERT了!用Transformers库的AutoModel,5分钟搞定文本相似度计算(附代码对比)

超越BERT:用Transformers库高效实现文本相似度计算的三种实战方案在自然语言处理领域,文本相似度计算是信息检索、问答系统和推荐系统等应用的核心技术。传统方法如TF-IDF或Word2Vec已逐渐被基于Transformer的预训练模型所取代。Hugging Face的Transform…

阅读更多
Prompt Engineering:重构人机协作的工程化方法论
2026/6/18 4:35:02

Prompt Engineering:重构人机协作的工程化方法论

1. 项目概述:这不是“写提示词”,而是重构人机协作的底层逻辑“Prompt Engineering”这个词,这两年被讲得太多,也太轻飘。很多人把它理解成“给AI发指令的技巧”,甚至简化为“多加几个形容词”“换种说法再试一次”。我…

阅读更多
Anthropic提示层归零:模型即协议的工程实践
2026/6/18 15:04:04

Anthropic提示层归零:模型即协议的工程实践

1. 项目概述:这不是一次普通更新,而是一次架构级“蒸发”“Anthropic Just Shipped the Layer That’s Already Going to Zero”——这个标题一出来,我正在调试一个Claude调用链的终端前停了三秒。不是因为震惊,而是因为熟悉&…

阅读更多
零碳供电所照明控制系统技术解析:标准要求与产品落地
2026/6/18 0:58:44

零碳供电所照明控制系统技术解析:标准要求与产品落地

一、零碳供电所对照明控制系统的硬性要求 《零碳供电所创建与评价规范》(T/ZDL 02-2022)是全国首个零碳供电所评价的团体标准,于2022年10月1日起实施-10-2。该标准将建筑、交通、办公、能源、建设与管理等多个维度零碳评价指标融为一体&#…

阅读更多
学生党AI学习指南:GPT、Gemini、WPS AI三工具协同实战
2026/6/18 0:58:44

学生党AI学习指南:GPT、Gemini、WPS AI三工具协同实战

1. 这不是工具清单,是学生党用时间砸出来的“AI生存指南”最近在图书馆自习区,我常看见对面座位的同学盯着屏幕发呆——不是在刷短视频,而是在和某个AI对话框反复拉扯:输入问题、删掉重写、再改提示词、等结果、皱眉、刷新……半小…

阅读更多
Gemini 3.1 Pro+DeepSider:新人零门槛AI工作流实战指南
2026/6/18 0:58:44

Gemini 3.1 Pro+DeepSider:新人零门槛AI工作流实战指南

1. 为什么Gemini 3.1 Pro值得新人认真对待——不是又一个“聊天玩具”最近在几个技术社群和内容创作小组里,总能看到有人发截图:“Gemini 3.1 Pro刚跑完一份20页PDF的逻辑图谱,还顺手把矛盾点标红了”;也有人贴出对比:…

阅读更多
GIT修改用户名
2026/6/17 19:45:33

GIT修改用户名

在GIT中修改用户名可按以下步骤操作: 查看当前git的用户名,使用命令git config --list或git config user.name。修改git用户名,使用命令git config --global user.name "xxx(新的用户名)",将其中…

阅读更多
Win11Debloat:让你的Windows系统重获新生的终极优化工具
2026/6/18 14:35:19

Win11Debloat:让你的Windows系统重获新生的终极优化工具

Win11Debloat:让你的Windows系统重获新生的终极优化工具 【免费下载链接】Win11Debloat A simple, lightweight PowerShell script that allows you to remove pre-installed apps, disable telemetry, as well as perform various other changes to declutter and …

阅读更多
技术深度解析:m4s-converter实现原理与B站缓存视频转换最佳实践
2026/6/18 15:23:49

技术深度解析:m4s-converter实现原理与B站缓存视频转换最佳实践

技术深度解析:m4s-converter实现原理与B站缓存视频转换最佳实践 【免费下载链接】m4s-converter 一个跨平台小工具,将bilibili缓存的m4s格式音视频文件合并成mp4 项目地址: https://gitcode.com/gh_mirrors/m4/m4s-converter m4s-converter是一个…

阅读更多