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

news/2023/5/28 8:44:54

国产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 200typedef struct SaveData 
{char N_S[N_S_Length];		//N/Schar 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.exyb.cn/news/show-4565187.html

如若内容造成侵权/违法违规/事实不符,请联系郑州代理记账网进行投诉反馈,一经查实,立即删除!

相关文章

使用JSON.stringify会导致的问题

1.undefined&#xff0c;Symbol&#xff0c;函数都会转变为undefined 这个时候如果用JSON.parse进行处理&#xff0c;会报错 2.布尔值、数字、字符串的包装对象会转换成原始值 3.NaN、Infinity 和 null 都会变成 null 4.Date日期会变成字符串 5.使用JSON.parse的时候&#xff0…

【JS】1441- 慎用 JSON.stringify

前言 项目中遇到一个 bug&#xff0c;一个组件为了保留一份 JSON 对象&#xff0c;使用 JSON.stringify 将其转换成字符串&#xff0c;这样做当然是为了避免对象是引用类型造成数据源的污染。但发现后面使用 JSON.parse 方法之后&#xff0c;发现数据有所变化。代码简化&#x…

qs.stringify 和 JSON.stringify 的区别和使用

qs.stringify 和 JSON.stringify 的区别和使用qs.stringify 和 JSON.stringify 都是序列化数据&#xff0c;但完全不是一个东西qs.stringify 的使用重点总结qs.stringify 和 JSON.stringify 都是序列化数据&#xff0c;但完全不是一个东西 比如&#xff1a; // 要序列化的数据…

利用 JSON.stringify 深拷贝的弊端

深拷贝不仅将原对象的各个属性逐个复制出去&#xff0c;而且将原对象各个属性所包含的对象也依次采用深拷贝的方法递归复制到新对象上。 function deepClone(obj){let obj_ JSON.stringify(obj),loneObj JSON.parse(obj_);return loneObj } let a[1,2,3,4,[2,3,4]], b deep…

java json.stringify_JSON.stringify 语法实例讲解

认识javascript也不短的时间了&#xff0c;可是这个用法说实在的&#xff0c;我还是第一次见过&#xff0c;惭愧啊惭愧啊。于是乎&#xff0c;在网上找了写资料&#xff0c;写了些例子 希望能给园子们一些帮助。作用&#xff1a;这个函数的作用主要是为了系列化对象的。可能有些…

TCP/IP应用层常见协议总结

TCP/IP应用层常见协议总结1.HTTP:超文本传输协议2.SMTP:简单邮件传输(发送)协议3.POP3/IMAP:邮件接收的协议4.FTP:文件传输协议5.Telnet:远程登陆协议6.SSH:安全的网络传输协议1.HTTP:超文本传输协议 超文本传输协议 主要是为 Web 浏览器与 Web 服务器之间的通信而设计的。当我…

java json.stringify_JSON.stringify 语法讲解

刚刚在逛园子的时候&#xff0c;突然看到了一位园友的文章&#xff0c;里面涉及到一这样一个javascript函数&#xff1a;JSON.stringify。认识javascript也不短的时间了&#xff0c;可是这个用法说实在的&#xff0c;我还是第一次见过&#xff0c;惭愧啊惭愧啊。于是乎&#xf…

【Stm32野火】:野火STM32F103指南者开发板烧写官方示例程序LCD无法点亮?LCD示例程序无法使用?

项目场景&#xff1a; 大家好&#xff0c;最近在使用野火STM32F103指南者开发板的时候发现官方的示例程序LCD驱动代码居然无法直接驱动LCD点亮&#xff0c;这让我百思不得其解&#xff0c;以下就是我的踩坑填坑的过程&#xff0c;希望对大家有所帮助。 野火官方资料下载文档链接…

云原生技能树-docker image 操作-练习篇

从Docker Hub 拉取已有镜像 一个Docker 镜像(image)包含了程序代码和程序运行所依赖的所有环境。 Docker 镜像一般存放在镜像仓库服务(Image Registry)里&#xff0c;默认的镜像仓库服务是Docker Hub。 用户可以制作、构建镜像、将镜像上传到镜像仓库服务&#xff0c;从而可以…

双单引号再c语言中吧表示什么意思,as3 if中的单引号表示什么意思

关于IFIF 条件判断语句&#xff0c;语法格式如下&#xff1a;IF [NOT] ERRORLEVEL number commandIF [NOT] string1string2 commandIF [NOT] EXIST filename command说明&#xff1a;[NOT] 将返回的结果取反值即“如果没有”的意思。ERRORLEVEL 是命令执行完成后返回的退出值Nu…

php中self是啥意思,php中self关键字的用法是什么_后端开发

php中self关键字的用法是&#xff1a;1、替换类名&#xff0c;援用当前类的静态成员变量和静态函数&#xff1b;2、抑止多态行动&#xff0c;援用当前类的函数而非子类中掩盖的完成。self老是指向当前类(及类实例)。用法&#xff1a;self老是指向“当前类(及类实例)”。细致引见…

php的foreach什么意思,php中foreach的用法是什么,php foreach as

php中foreach的用法是什么PHP中foreach的用法是什么&#xff0c;foreach在php中的用法是&#xff1a;【foreach($ array as $ value){要执行的代码&#xff1b;}]&#xff0c;对于每个循环&#xff0c;当前数组元素的值将被赋给$value变量&#xff0c;并且将为下一个循环获得数…

php yied和return,php yield是什么意思?

php yield的意思是该yield关键字从发电机函数返回数据&#xff0c;yield语句看起来很像return语句&#xff0c;yield不是停止函数的执行并返回&#xff0c;而是为循环生成器的代码提供一个值&#xff0c;并暂停生成器函数的执行。php yield的意思是&#xff1a;1、什么yield&am…

vue $emit什么意思?

第一次接触vue时候发现了 $emit&#xff0c;一脸懵逼&#xff0c;不知道是个什么玩意。 但是清楚了vue的父子组件后就明白了$emit的意思。 这里简单的做个demo展示一下。 1.首先创建子组件与父组件,注意看我的层级关系。 demo.vue为主文件&#xff0c;child为子组件 2. tap“o…

EOL while scanning string literal错误

file rC:\Users\ME\Desktop\Python project\pachong\scrapy\secondDemo\photo\ this_url[-15:-4] .jpg这是爬取图片&#xff0c;保存在文件时的一个代码片段&#xff0c;一直出现错误&#xff1a;EOL while scanning string literal翻译了下&#xff0c;原来是因为扫描字符串…

在php什么意思,请问?=‘在PHP中是什么意思?

繁花不似锦因为它不会增加任何价值echo&#xff0c;我认为您希望了解PHP中的确切含义&#xff1a;Array([0] > Array([0] > 368 // T_OPEN_TAG_WITH_ECHO[1] > [2] > 1)[1] > Array([0] > 309 // T_VARIABLE[1] > $a [2] > 1)[2] > ; //…

在php中isset什么意思,php里的isset是什么意思

PHP中的isset() 函数用于检测变量是否已设置并且非 NULL。如果已经使用 unset() 释放了一个变量之后&#xff0c;再通过 isset() 判断将返回 FALSE。若使用 isset() 测试一个被设置成 NULL 的变量&#xff0c;将返回 FALSE。同时要注意的是 null 字符("\0")并不等同于…

xor在PHP是什么意思,?=‘在PHP中是什么意思?

万千封印因为它不会增加任何价值echo&#xff0c;我认为您希望了解PHP中的确切含义&#xff1a;Array([0] > Array([0] > 368 // T_OPEN_TAG_WITH_ECHO[1] > [2] > 1)[1] > Array([0] > 309 // T_VARIABLE[1] > $a [2] > 1)[2] > ; // U…

php中php_eol是啥,php php_eol的用法

php php_eol的用法&#xff1a;替代换行符&#xff0c;会根据平台而变&#xff0c;windows下是“/r/n”&#xff0c;linux下是“/n”&#xff0c;mac下是“/r”&#xff1b;一般可以使用“str_replace(PHP_EOL,,字符串)”来去除换行符&#xff0c;兼容各平台。推荐&#xff1a;…

VIM 报错 detected while processing function SNR24_MRU_AddFile

找到对应该目录&#xff0c;给这个文件权限 sudo chmod 777 .vim_mru_files 就搞定最开始出现在问题是。 Taglist: Failed to generate tags for /my/path/to/file ctags 原因&#xff1a; 原来taglist只支持exuberant ctags tool,不支持GNU ctags或UNIX ctags 解…