找回密码
 立即注册
查看: 1476|回复: 6

STC8H怎么解码GPS模块的NMEA协议

[复制链接]

2

主题

5

回帖

52

积分

注册会员

积分
52
发表于 2023-6-3 03:46:46 | 显示全部楼层 |阅读模式
在拿到GPS模块以后,发现接收NMEA的数据流占用了大量的CPU资源,而且数天过去,还没有相关怎么处理接收到的数据的思路,希望大神指点以下
回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:447
  • 最近打卡:2025-06-19 15:15:10
已绑定手机

40

主题

2064

回帖

7107

积分

论坛元老

积分
7107
发表于 2023-6-3 10:00:01 | 显示全部楼层
能否详细介绍一下你的需求跟做法?
GPS数据量不是很大,照理来说不应该会占用大量系统资源。
回复 支持 反对

使用道具 举报 送花

2

主题

5

回帖

52

积分

注册会员

积分
52
发表于 2023-6-3 11:18:00 | 显示全部楼层
乘风*** 发表于 2023-6-3 10:00
能否详细介绍一下你的需求跟做法?
GPS数据量不是很大,照理来说不应该会占用大量系统资源。 ...

就是需要一直进串口中断,做数据处理,我需要把接收到的数据分别发送给串口屏显示出来
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:447
  • 最近打卡:2025-06-19 15:15:10
已绑定手机

40

主题

2064

回帖

7107

积分

论坛元老

积分
7107
发表于 2023-6-3 11:51:20 | 显示全部楼层
10079*** 发表于 2023-6-3 11:18
就是需要一直进串口中断,做数据处理,我需要把接收到的数据分别发送给串口屏显示出来 ...
在中断里进行数据接收,然后在主循环里对收到的数据进行解析、处理。
可参考这个例子的方法:
1.png
主循环需要处理的任务比较多的话,可使用定时器计时分时处理不同功能函数,例程的流程比较简单才使用延时函数。

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民II
  • 打卡总天数:98
  • 最近打卡:2025-06-20 10:10:18

74

主题

6114

回帖

1万

积分

超级版主

积分
12787
发表于 2023-6-3 15:28:29 | 显示全部楼层
本帖最后由 梁工 于 2023-6-3 15:36 编辑

其实接收处理GPS模块的报文很简单的。
报文波特率一般默认是9600,1秒1次发报文,1.04ms一个字节,进中断保存一个字节至接收缓冲数组,一般不超过2us(STC8系列,主频22.1184M),占CPU时间0.2%,基本可以忽略。
就算设置为115200,86.8us一个字节,占比也是2.3%,不存在占用大量系统资源的说法。
报文以回车换行(0x0d 0x0a)结束,将报文提交给主程序区处理。
主程序发现收到一个报文,先搜索报文名称,然后根据报文内容提出需要的数据。

比如北斗模块的GPRMC报文如下:
未定位: $GPRMC,013332.00,V,,,,,,,060321,,,N*7B
已定位: $GPRMC,013333.00,A,2232.62026,N,11358.30066,E,0.178,,060321,,,A*75
字段:     0       1      2    3       4     5       6   7  8   9   10 11 12

字段0:  $GPRMC, 语句ID, 表明该语句为Recommended Minimum Specific GPS/TRANSIT Data (RMC) 推荐最小定位信息
字段1:  UTC时间, hhmmss.sss格式
字段2:  状态, A=定位, V=未定位
字段3:  纬度ddmm.mmmm, 度分格式(前导位数不足则补0)
字段4:  纬度N(北纬)或S(南纬)
字段5:  经度dddmm.mmmm, 度分格式(前导位数不足则补0)
字段6:  经度E(东经)或W(西经)
字段7:  速度, 节, Knots
字段8:  方位角, 度
字段9:  UTC日期, DDMMYY格式
字段10: 磁偏角, (000 - 180)度(前导位数不足则补0)
字段11: 磁偏角方向, E=东W=西
字段12: 校验值
回复 支持 反对

使用道具 举报 送花

2

主题

5

回帖

52

积分

注册会员

积分
52
发表于 2023-6-7 14:34:39 | 显示全部楼层
梁*** 发表于 2023-6-3 15:28
其实接收处理GPS模块的报文很简单的。
报文波特率一般默认是9600,1秒1次发报文,1.04ms一个字节,进中断保 ...

谢谢梁工,我之前一直是在中断里处理所有数据,所以显示一直被打断,感谢梁工给的思路

点评

收到一个字节进中断,判断是否收到回车换行(0x0d 0x0a),不是则退出接收中断。 收到回车换行(0x0d 0x0a),则一个报文结束,一般有两个方法处理: 1、串口接收单缓冲,则将收到的数据拷贝到另一个数组,并做标志  详情 回复 发表于 2023-6-7 14:43
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民II
  • 打卡总天数:98
  • 最近打卡:2025-06-20 10:10:18

74

主题

6114

回帖

1万

积分

超级版主

积分
12787
发表于 2023-6-7 14:43:39 | 显示全部楼层
10079*** 发表于 2023-6-7 14:34
谢谢梁工,我之前一直是在中断里处理所有数据,所以显示一直被打断,感谢梁工给的思路 ...

收到一个字节进中断,判断是否收到回车换行(0x0d 0x0a),不是则退出接收中断。
收到回车换行(0x0d 0x0a),则一个报文结束,一般有两个方法处理:
1、串口接收单缓冲,则将收到的数据拷贝到另一个数组,并做标志,提供给主程序处理,串口继续接收后面的数据。
2、串口接收双缓冲,做标志,收到数据的缓冲提供给主程序处理,切换到另一个缓冲接收,串口继续接收后面的数据。
回复 支持 反对

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-6-20 13:15 , Processed in 0.115198 second(s), 90 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表