STM32读取GPS(北斗)数据驱动程序

本文介绍了如何使用STM32F103通过串口接收SKG12D模块发送的GPS(北斗)定位数据,涉及数据接收判断、有效性校验和关键信息提取。主要解析RMC数据包,提供了一个简单的驱动程序实现。
摘要由CSDN通过智能技术生成

本文博客链接: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
STM32单片机读写 ATGM336H(GPS)模块+液晶显示DEMO软件例程源码,可做为你的学习设计参考。 int main(void) { uint32_t lcdid; char cStr[100]; double deg_lat;//转换成[degree].[degree]格式的纬度 double deg_lon;//转换成[degree].[degree]格式的经度 nmeaINFO info; //GPS解码后得到的信息 nmeaPARSER parser; //解码时使用的数据结构 uint8_t new_parse=0; //是否有新的解码数据标志 nmeaTIME beiJingTime; //北京时间 /* 复位所有外设,初始化Flash接口和系统滴答定时器 */ HAL_Init(); /* 配置系统时钟 */ SystemClock_Config(); /* 初始化3.5寸TFT液晶模组,一般优先于调试串口初始化 */ lcdid=BSP_LCD_Init(); /* 初始化串口并配置串口中断优先级 */ MX_DEBUG_USART_Init(); MX_SPIFlash_Init(); MX_USARTx_Init(); /* 初始化LED */ LED_GPIO_Init(); /* 调用格式化输出函数打印输出数据 */ printf("LCD ID=0x%08X\n",lcdid); LCD_Clear(0,0,LCD_DEFAULT_WIDTH,LCD_DEFAULT_HEIGTH,BLACK); /* 开背光 */ LCD_BK_ON(); /* 设置用于输出调试信息的函数 */ nmea_property()->trace_func = &trace; nmea_property()->error_func = &error; nmea_property()->info_func = &gps_info; /* 初始化GPS数据结构 */ nmea_zero_INFO(&info); nmea_parser_init(&parser); /* 使用DMA传输数据到电脑端 */ HAL_UART_Receive_DMA(&husartx,gps_rbuff,GPS_RBUFF_SIZE); while(1) { if(GPS_HalfTransferEnd) /* 接收到GPS_RBUFF_SIZE一半的数据 */ { /* 进行nmea格式解码 */ nmea_parse(&parser, (const char*)&gps_rbuff[0], HALF_GPS_RBUFF_SIZE, &info); GPS_HalfTransferEnd = 0; //清空标志位 new_parse = 1; //设置解码消息标志 } else if(GPS_TransferEnd) /* 接收到另一半数据 */ { nmea_parse(&parser, (const char*)&gps_rbuff[HALF_GPS_RBUFF_SIZE], HALF_GPS_RBUFF_SIZE, &info); GPS_TransferEnd = 0; new_parse =1; } if(new_parse ) //有新的解码消息 { /* 对解码后的时间进行转换,转换成北京时间 */ GMTconvert(&info.utc,&beiJingTime,8,1); /* 输出解码得到的信息 */ printf("\r\n时间%d-%02d-%02d,%d:%d:%d\r\n", beiJingTime.year+1900, beiJingTime.mon,beiJingTime.day,beiJingTime.hour,beiJingTime.min,beiJingTime.sec); //info.lat lon中的格式为[degree][min].[sec/60],使用以下函数转换成[deg
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值