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

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

[复制链接]

该用户从未签到

2

主题

5

回帖

30

积分

新手上路

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

使用道具 举报

  • TA的每日心情
    奋斗
    昨天 08:59
  • 签到天数: 154 天

    [LV.7]常住居民III

    27

    主题

    1408

    回帖

    4382

    积分

    论坛元老

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

    使用道具 举报

    该用户从未签到

    2

    主题

    5

    回帖

    30

    积分

    新手上路

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

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

    使用道具 举报

  • TA的每日心情
    奋斗
    昨天 08:59
  • 签到天数: 154 天

    [LV.7]常住居民III

    27

    主题

    1408

    回帖

    4382

    积分

    论坛元老

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

    回复 支持 反对 送花

    使用道具 举报

    该用户从未签到

    46

    主题

    3118

    回帖

    7033

    积分

    超级版主

    积分
    7033
    发表于 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

    回帖

    30

    积分

    新手上路

    积分
    30
     楼主| 发表于 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
    回复 支持 反对 送花

    使用道具 举报

    该用户从未签到

    46

    主题

    3118

    回帖

    7033

    积分

    超级版主

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

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

    使用道具 举报

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

    本版积分规则

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

    GMT+8, 2024-6-1 10:18 , Processed in 0.066994 second(s), 59 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

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