本文博客链接:https://blog.csdn.net/zsj2016o/article/details/111285518 作者:zsj ,转载请注明.
好久没有写文章,这段时间一直在着急赶项目,时间一直被压缩,手里积累了不少想分享的资源,现在开始陆陆续续的编写,希望大家都在自己的技术之路上,越走越远,越研越深。
#此次分享的是 利用STM32解析GPS(北斗)数据,利用STM32F103串口接收SKG12D发来的定位数据,并进行接收判断,有效性判断以及关键信息提取。
1、GPS(北斗)介绍
这部分我就不多说了,相信你在查找资料的过程中,已经了解的7788,这部分不是你想看的,甚至是已经看吐了,这里一笔带过(原
谅我的懒,不愿意去百度复制粘贴)。
2、模组介绍
我采用的天工家的SKG12D,为什么这么选我也就不多说了,直接上Datasheet。
https://download.csdn.net/download/zsj2016o/13704204,这里面包含三个,分别是SKG12A、SKG12B、SKG12D,我用的是SKG12D的模组。
3、解析说明
大家通常使用GPS或者北斗获取当前的定位信息、时间信息,如果只需要这些,处理GPS或北斗发来的数据只需要解析RMC(可能是GPRMC或者是GNRMC)数据包即可。
下图为SKG12D手册中关于RMC的表述
我后面给出的程序里,只写了关于RMC的解析,程序是自己写的,不喜勿喷。
驱动中包括三部分,数据包接收判定(串口有数据并且一定时间内无变化)、数据包校验(根据协议格式判断)、数据解析(提取关键信息,时间及位置)。
void BeidouMain(void)
{
Beidou_RecPackCheck();//wifi接收检测,是否有数据RecPackOk =1
BeiDouDataReceivePro(); //wifi数据检测,是否有RMC数据包
BeiDouDataPrasePro(); //wifi数据解析
}
/*
函数说明:
此函数用来检测是否接收到RMC数据包,根据RMC协议格式进行解析,
本方式是根据协议格式,具体说是定位成功的协议格式进行判断,
成功 BeiDouRecType = RMC BeiDou.location定位标志 为'A'
不成功,有两种情况,一个是不为RMC包,如果为RMC包,那就定位
不成功,BeiDou.location = 'V'
*/
#define BeiDouRecPrintor 67
void BeiDouDataReceivePro(void)
{
u16 i,j;
u8 sun = 0;
u8 sumH = 0;
u8 sumL = 0;
if(BeiDouUart.RecPackOk != 1 ) return;//接收到数据再往下进行
for(i = 0;i<255;i++)
{
if(BeiDouUart.RxBuf[i] == '$')
{
if(BeiDouUart.RxBuf[i+BeiDouRecPrintor] == '*')
{
for(j = 1;j<BeiDouRecPrintor;j++)
{
sun ^= BeiDouUart.RxBuf[i+j];
}
if((BeiDouUart.RxBuf[i+BeiDouRecPrintor+1] <0x3a) && (BeiDouUart.RxBuf[i+BeiDouRecPrintor+1] > 0x2f))//
{
sumH = BeiDouUart.RxBuf[i+BeiDouRecPrintor+1]-0x30;//校验和高位
}
else if((BeiDouUart.RxBuf[i+BeiDouRecPrintor+1] <0x47) && (BeiDouUart.RxBuf[i+BeiDouRecPrintor+1] > 0x40))//
{
sumH = BeiDouUart