【国产GD32芯片解析中科微北斗+GPS模块经纬度数据详细教程-附完整代码工程】

news2024/9/21 2:35:46

国产GD32芯片解析中科微北斗+GPS模块经纬度数据详细教程-附完整代码工程

  • 简介
  • 准备工作
    • PC端需要用到的工具
    • 代码下载地址
    • GD32F103C8T6最小系统板
  • 代码实现
    • GD32串口引脚定义如下:
    • 串口的初始化
      • 串口0初始化代码:
      • 串口1初始化代码
    • 串口的输入
      • 串口0的输入代码如下:
      • 串口1的输入代码如下:
    • 串口打印
      • 串口0的串口打印输出代码如下:
      • 串口1的串口打印输出代码如下:
    • GPS模块的数据解析
      • 解析代码
      • 主函数
      • 完整的工程代码下载地址:
    • 北斗+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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/172381.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

非标准包 game.rgss3a 的打开方法 | 2023 年实测

写在前面&#xff1a;最近在玩 RPG 游戏&#xff0c;想拆一个 Game.rgss3a 包&#xff0c;在网上找了很久的拆包方法&#xff0c;感觉写的比较凌乱&#xff0c;我来给大家整理一下吧。不过我本人的技术能力也很差&#xff0c;不确定说的是不是对的&#xff0c;就当是给大家提供…

中国智造助推跨境电商企业迈向全球市场

现今&#xff0c;跨境电商行业发展的如火如荼&#xff0c;中国智造也在不断助推跨境电商企业迈向全球市场。业内人员在新常态下的思想也有了一些改变&#xff0c;现在的跨境电商都是“平台物流”&#xff0c;在物流环节&#xff0c;也需要我们的专业团队去进行整合&#xff0c;…

GD32F450寄存器和库函数

GD32F4xx用户手册 GD32F450xx数据手册 GD32F3x0固件库使用指南 一、寄存器介绍 1. 存储器映射表 GD32是一个32位的单片机&#xff0c;它的地址范围为2的32次方&#xff0c;也就是4GB的地址空间。 为了降低不同客户在相同应用时的软件复杂度&#xff0c;存储映射是按Corte…

python能做的100件事03-python爬虫

文章目录1. scrapy介绍2 新建爬虫项目3 新建蜘蛛文件4 运行爬虫5 爬取内容5.1分析网页结构5.2 关于Xpath解析5.3 接着解析电影数据5.4 下载缩略图5.5 完整代码6 最后说明本例基于python3和scrapy爬虫框架&#xff0c;不再介绍python的基础知识和爬虫的基本知识。1. scrapy介绍 …

制药企业的发展趋势--行业公司数据调研

制药行业是国家重点培育发展的战略产业。制药行业的发展对人民健康、医药科技和社会进步等方面都有着十分重要的作用。下面笔者将阐述近年来制药行业发展的现状及趋势&#xff0c;并对制药行业的研发、销售等多维度的信息进行展示与解读。中国制药企业现状目前&#xff0c;中国…

分享103个PHP源码,总有一款适合您

PHP源码 分享103个PHP源码&#xff0c;总有一款适合您 下面是文件的名字&#xff0c;我放了一些图片&#xff0c;文章里不是所有的图主要是放不下...&#xff0c; 103个PHP源码下载链接&#xff1a;https://pan.baidu.com/s/1_T5IzwgcntFuyqulehbSzQ?pwdv6ds 提取码&#…

vue-router 使用与原理分析

简介 Vue Router 是Vue.js的官方路由。与Vue.js核心深度集成&#xff0c;让用Vue.js构建单页应用&#xff08;SPA&#xff09;变得更加简单。 使用 创建 1、在安装好Vue Router依赖后&#xff0c;在App.vue中引入router-view&#xff0c;它是渲染的容器 <div id"…

ARM X210开发板的软开关按键问题

一、X210 开发板的软启动电路详解 《x210bv3.pdf》 (1) 210 供电需要的电压比较稳定&#xff0c;而外部适配器的输出电压不一定那么稳定&#xff0c;因此板载了一个文稳压器件 MP1482. 这个稳压芯片的作用就是外部适配器电压在一定范围内变化时稳压芯片的输出电压都是 5V。 (2)…

Redis 主从复制

目录一、简介二、复制功能三、将服务器设置为从服务器3.1、手动设置3.2、REPLICAOF 配置选项3.3、取消复制四、查看服务器的角色4.1、查看主服务器4.2、查看从服务器五、其他配置5.1、无硬盘复制5.2、降低数据不一致情况出现的概率5.3、可写的从服务器5.4、选择性命令传播六、w…

SpringBoot统一功能处理

目录 一、统一用户的登录验证 1.1 Spring AOP 实现用户统一登录验证 1.2Spring拦截器实现统一用户的登录验证 1.3 实例演示&#xff08;通过url访问controller层的方法&#xff09; 二、统一异常处理 三、统一数据格式返回 3.1 统一数据返回格式的优点 3.2 统一数据返回…

旺季到来,跨境电商卖家年末冲刺!

又是一年年末时&#xff0c;随着新年的到来&#xff0c;在年底这段时间里&#xff0c;对于跨境电商卖家来说&#xff0c;又是一个关键节点。而现在&#xff0c;卖家们也将迎来一年一度的旺季收官&#xff0c;在此过程中卖家需要做好哪些准备做好年末冲刺呢&#xff1f; 在许多…

量化策略——准备3 数据、Backtrader回测框架与quantstats评价指标

我们一般使用AKShare这个库来获取股票数据或策略中用得到的数据&#xff1a; AKShare github主页&#xff1a;https://github.com/akfamily/akshare 使用Backtrader框架作为回测的框架&#xff1a; Backtrader github主页&#xff1a;https://github.com/mementum/backtrader …

【CTF】git源码泄露和代码审计

目录 源码获取 函数绕过 解法一&#xff1a; 解法二&#xff1a; 参考文章&#xff1a; 源码获取 这里做的web题目是buuctf中的&#xff1a;[GXYCTF2019]禁止套娃 打开页面&#xff0c;查看源码是没有可以利用的点的。开始进行目录扫描 这里使用的工具是dirsearch。直接…

前端js实现多次添加累加文件上传和选择删除(django+js)- 编辑回显文件并上传 (二)

前言 后端返回的是文件地址&#xff0c;并不是文件流或base64编码字符串&#xff0c;而修改数据的接口又只接受文件。 本篇文章主要是基于累加文件上传介绍的。 添加上传文件文章链接&#xff1a;https://blog.csdn.net/qq_43030934/article/details/128726549?spm1001.2014.…

jmeter 压测java代码

一、背景 直接压测、调用java工程中的方法。&#xff08;没有http等的入口&#xff09; 二、java项目改造 一个java项目&#xff0c;想要压测其中的几个方法。我们需要在该工程中&#xff0c;添加一个压测入口的类&#xff0c; 这个类必须继承或者实现jmeter提供的接口/类。…

C语言萌新如何使用scanf函数?

&#x1f40e;作者的话 如果你搜索输入输出函数&#xff0c;那么你会看到输入输出流、Turbo标准库、标准输出端、stdout什么什么乱七八糟的&#xff0c;作为一个萌新&#xff0c;哪懂这些&#xff1f; 本文介绍萌新在前期的学习中&#xff0c;常用的输入输出函数及其功能~ 跳…

HTML5+CSS3小实例:炫彩的发光字特效

前言&#xff1a; 今天我们向大家精选了一款HTML5CSS3文字特效&#xff0c;文字特效有超酷的动画类型&#xff0c;不多说&#xff0c;一起来看看。 描述&#xff1a; 这款文字特效既有倒影的效果&#xff0c;又有随机的颜色&#xff0c;看起来非常的炫酷。全文基于 HTML5CSS3 完…

log4j.properties自定义日志配置

一、通用的写法log4j.properties# 设置root logger等级为ALL&#xff0c;且appender有A1和FILE log4j.rootLoggerALL, A1,A3#设置com.example.test logger log4j.logger.com.example.testDEBUG,A1,A3 # 取消继承父类 log4j.additivity.com.example.testfalse# 设置个控制台输出…

即时通讯开发之TCP 连接的建立与中止

TCP 是一个面向连接的协议,所以在连接双方发送数据之前,都需要首先建立一条连接。这和前面讲到的协议完全不同。前面讲的所有协议都只是发送数据 而已,大多数都不关心发送的数据是不是送到,UDP 尤其明显,从编程的角度来说,UDP 编程也要简单 的多----UDP 都不用考虑数据分片。 书…

Ubuntu下源码编译VirtualBox一 —— 源码下载

VirtualBox想必大家都不陌生&#xff0c;做Linux开发的尤其是嵌入式Linux开发的人应该基本都知道或玩过VMware和VirtualBox。但通常都是为了在Windows电脑上能够使用Linux环境、即在Windows环境下通过下载可执行文件安装的VirtualBox。本文介绍在Linux环境&#xff08;Ubuntu 2…