【中科微北斗+GPS模块经纬度数据解析详细教程-附免费代码工程】

简介

北斗+GPS定位模块测试板的测试工作已完成,计划春节后开售,本文介绍GD32作为主控芯片对北斗+GPS定位模块的经纬度数据的解析方法。

准备工作

PC端需要用到的工具

  1. XCOM串口调试助手;
  2. GPS经纬度地图定位工具。
    下载地址:
    https://pan.baidu.com/s/1scQYIS97CqzUzH5XQ3CI6A?pwd=5u0w

代码下载地址

完整的工程代码下载地址:
https://download.csdn.net/download/YANGJIERUN/87381512

GD32F103C8T6最小系统板

使用了gd32f103c8t6最小系统开发板,某宝上搜素“Makerbase高博士GD32开发板”即可找到,只需要30多块钱,如下图。
高博士GD32F103C8T6最小系统板

代码实现

GD32串口引脚定义如下:

GD32F103C8T6串口引脚说明:

串口发送管脚(TX)接收管脚(RX)
USART0PA9PA10
USART1PA2PA3
USART2PB10PB11

本例程使用USART0下载程序、Debug打印数据使用,另外使用USART1读取GPS数据。

串口的初始化

USART0、USART1的初始化步骤一致,只是函数参数上USART0改为了USART1而已。

串口0初始化代码:

// 串口 0 初始化
void USART0_init(uint32_t bound)
{
	/* enable USART clock */
    rcu_periph_clock_enable(RCU_USART0);
    
	/* enable GPIO clock */
	rcu_periph_clock_enable(RCU_GPIOA);
	
	/* connect port to USARTx_Tx */
	gpio_init(GPIOA, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_9);
	/* connect port to USARTx_Rx */
	gpio_init(GPIOA, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ, GPIO_PIN_10);
	
	/* USART configure */
    usart_deinit(USART0);
    usart_baudrate_set(USART0, bound);
    usart_word_length_set(USART0, USART_WL_8BIT);
    usart_stop_bit_set(USART0, USART_STB_1BIT);
    usart_parity_config(USART0, USART_PM_NONE);
    usart_hardware_flow_rts_config(USART0, USART_RTS_DISABLE);
    usart_hardware_flow_cts_config(USART0, USART_CTS_DISABLE);
    usart_receive_config(USART0, USART_RECEIVE_ENABLE);
    usart_transmit_config(USART0, USART_TRANSMIT_ENABLE);
    usart_enable(USART0);
}

串口1初始化代码

// 串口 1 初始化
void USART1_init(uint32_t bound)
{
	/* enable USART clock */
    rcu_periph_clock_enable(RCU_USART1);
	/* enable GPIO clock */
	rcu_periph_clock_enable(RCU_GPIOA);
	
	/* connect port to USARTx_Tx */
	gpio_init(GPIOA, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_2);
	/* connect port to USARTx_Rx */
	gpio_init(GPIOA, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ, GPIO_PIN_3);
	
	/* USART configure */
    usart_deinit(USART1);
    usart_baudrate_set(USART1, bound);
    usart_word_length_set(USART1, USART_WL_8BIT);
    usart_stop_bit_set(USART1, USART_STB_1BIT);
    usart_parity_config(USART1, USART_PM_NONE);
    usart_hardware_flow_rts_config(USART1, USART_RTS_DISABLE);
    usart_hardware_flow_cts_config(USART1, USART_CTS_DISABLE);
    usart_receive_config(USART1, USART_RECEIVE_ENABLE);
    usart_transmit_config(USART1, USART_TRANSMIT_ENABLE);
    usart_enable(USART1);
}

串口的输入

串口输入本教程使用最简单的轮询输入。网上有教程是通过重写scanf实现串口输入的,但是重写scanf的实际使用很不好。数据一多就出错,而且只能被一个串口使用,本人不推荐大家使用。个人觉得还是C语言库里面的getchar()用的舒服。

串口0的输入代码如下:

//串口0的专用 getchar 函数
char USART0_getchar(void)
{
	/* 等待串口输入数据 */
	while (usart_flag_get(USART0, USART_FLAG_RBNE) == RESET);
	return (char)usart_data_receive(USART0);
}

串口1的输入代码如下:

//串口1的专用 getchar 函数
char USART1_getchar(void)
{
	/* 等待串口输入数据 */
	while (usart_flag_get(USART1, USART_FLAG_RBNE) == RESET);
	return (char)usart_data_receive(USART1);
}

串口打印

串口0的串口打印输出代码如下:

//串口0的专用 putchar 函数
void USART0_putchar(char ch)
{
	usart_data_transmit(USART0, (uint8_t)ch);
	while(RESET == usart_flag_get(USART0, USART_FLAG_TBE));
}
 
//串口0的专用 puts 函数
void USART0_puts(char* fmt)
{
	uint16_t i = 0;
	while(fmt[i] != '\0')
	{
		USART0_putchar(fmt[i]);
		i++;
	}
}

串口1的串口打印输出代码如下:

//串口1的专用 putchar 函数
void USART1_putchar(char ch)
{
	usart_data_transmit(USART1, (uint8_t)ch);
	while(RESET == usart_flag_get(USART1, USART_FLAG_TBE));
}
 
//串口1的专用 puts 函数
void USART1_puts(char* fmt)
{
	uint16_t i = 0;
	while(fmt[i] != '\0')
	{
		USART1_putchar(fmt[i]);
		i++;
	}
}

GPS模块的数据解析

解析GPS的经纬度就是对串口上来的数据进行字符串匹配。中科微的GPS模组手册里面有其他数据解析的说明,这里只解析经纬度,其他数据的解析也是大同小异。经纬度的计算方法如下图:
经纬度解析方法

解析代码

#include "DRG_GPS_Mode.h"
 
#define BUFF_SIZE 200
 
typedef struct SaveData 
{
	char N_S[N_S_Length];		//N/S
	char E_W[E_W_Length];		//E/W
} _SaveData;
 
_SaveData Save_Data;
 
// 解析 GPS 数据
void parseGpsBuffer(void)
{
	uint8_t ch,Rxbuffer[BUFF_SIZE];
	uint16_t index,i;
	while(1)
	{
		ch = USART1_getchar();
		if(ch == '$')
		{
			index = 0;
			while(ch != ',')
			{
				ch = USART1_getchar();
				Rxbuffer[index] = ch;
				index++;
			}
			if(!strcmp("GNGLL,",(const char*)Rxbuffer))
			{
				for(i = 0;i < 10;i++)
					Save_Data.N_S[i] = USART1_getchar();
				ch = USART1_getchar();
				ch = USART1_getchar();
				ch = USART1_getchar();
				for(i = 0;i < 10;i++)
					Save_Data.E_W[i] = USART1_getchar();
				break;
			}
		}
	}
	/*
	USART0_puts("Save_Data.N_S = ");
	USART0_puts(Save_Data.N_S);
	USART0_puts("\r\n");
	USART0_puts("Save_Data.E_W = ");
	USART0_puts(Save_Data.E_W);
	USART0_puts("\r\n");
	*/
}
 
// 获取 GPS 纬度数据 - 字符串形式
char* Get_Gps_N_S_str(void)
{
	return Save_Data.N_S;
}
 
// 获取 GPS 经度数据 - 字符串形式
char* Get_Gps_E_W_str(void)
{
	return Save_Data.E_W;
}

主函数

#include "DRG_GPS_Mode.h"
 
int main(void)
{
	USART0_init(115200U);
	USART1_init(9600U);
	USART0_puts("USART0 begin...\r\n");
	USART1_puts("USART1 begin...\r\n");
   	while(1)
	{
		parseGpsBuffer();				// 解析串口 1 上 GPS 模块的数据
		
		USART0_puts("N_S = ");
		USART0_puts(Get_Gps_N_S_str());	// 打印维度字符串数据
		USART0_puts("\r\n");
		
		USART0_puts("E_W = ");
		USART0_puts(Get_Gps_E_W_str());	// 打印经度字符串数据
		USART0_puts("\r\n");
	}
}
 

完整的工程代码下载地址:

https://download.csdn.net/download/YANGJIERUN/87381512

北斗+GPS定位模块的验证

串口助手读取到的数据:
在这里插入图片描述
使用定位工具可以判断读取的数据是否准确。注意GPS模块要拿到室外定位,这样数据才准确。
在这里插入图片描述

参考

https://blog.csdn.net/YANGJIERUN/article/details/128667480

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值