u-blox-M8N GNSS定位模块调试

2024-01-15 01:10
文章标签 模块 调试 定位 gnss blox m8n

本文主要是介绍u-blox-M8N GNSS定位模块调试,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

RMC消息格式

在这里插入图片描述
在这里插入图片描述
串口接收到消息如下:
在这里插入图片描述

消息解析代码

根据RMC消息格式可以解析多种数据(时间、经纬度、海拔)

#include "gps.h"char HMSTime[10];   //时间,小时分秒
char latitude[12];  //纬度
char N_S[1]; //
char longitude[12]; //经度
char E_W[1]; //
char speed[10]; //速度,相当不准
char DMYTime[10];
char height[12];      //高度,相当不准//使用GPGGA信息格式
void GpsBufferParse(uint8_t gpsDataRx[150])
{char *subString;char *subStringNext;int i = 0;for(i = 0; i <= 9; i ++){if(i == 0){if((subString = strstr(gpsDataRx, ",")) == NULL) ;//无位置信息返回}else{subString ++;if((subStringNext = strstr(subString, ",")) != NULL){switch(i){//$GNRMC,064726.00,A,3150.33878,N,11707.97461,E,0.726,,021221,,,A*63//RMC位置信息头case 0: break;//时间,小时分秒,hhmmss.sscase 1: memcpy(HMSTime, subString, subStringNext - subString);break;//状态位case 2: break;//纬度case 3: memcpy(latitude, subString, subStringNext - subString);break;//case 4: memcpy(N_S, subString, subStringNext - subString);break;//经度case 5: memcpy(longitude, subString, subStringNext - subString);break;//case 6: memcpy(E_W, subString, subStringNext - subString);break;//速度case 7: memcpy(speed, subString, subStringNext - subString);break;//角速度case 8:break;//时间,日月年,ddmmyycase 9:memcpy(DMYTime, subString, subStringNext - subString);break;//case 10:break;default: break;}//match switch		subString = subStringNext;}//match if}//match else}//match for
}

usart.c中对串口进行配置及中断函数:

void UART6_Init(u32 bound)
{	//UART 初始化设置UART6_Handler.Instance=USART6;					    //USART1UART6_Handler.Init.BaudRate=bound;				    //波特率UART6_Handler.Init.WordLength=UART_WORDLENGTH_8B;   //字长为8位数据格式UART6_Handler.Init.StopBits=UART_STOPBITS_1;	    //一个停止位UART6_Handler.Init.Parity=UART_PARITY_NONE;		    //无奇偶校验位UART6_Handler.Init.HwFlowCtl=UART_HWCONTROL_NONE;   //无硬件流控UART6_Handler.Init.Mode=UART_MODE_TX_RX;		    //收发模式UART6_Handler.Init.HwFlowCtl = UART_HWCONTROL_NONE;UART6_Handler.Init.OverSampling = UART_OVERSAMPLING_16;if(HAL_UART_Init(&UART6_Handler) != HAL_OK)Error_Handler();					    //HAL_UART_Init()会使能UART1HAL_UART_Receive_IT(&UART6_Handler, (uint8_t *)uartBuffer, RXBUFFERSIZE);
}
/**USART6 GPIO Configuration    PC6     ------> USART6_TXPC7     ------> USART6_RX */if(huart->Instance==USART6)//如果是串口1,进行串口1 MSP初始化{__HAL_RCC_GPIOC_CLK_ENABLE();			//使能GPIOA时钟__HAL_RCC_USART6_CLK_ENABLE();			//使能USART2时钟GPIO_Initure.Pin=GPIO_PIN_6 | GPIO_PIN_7;			//PD8\9GPIO_Initure.Mode=GPIO_MODE_AF_PP;		//复用推挽输出GPIO_Initure.Pull=GPIO_PULLUP;			//上拉GPIO_Initure.Speed=GPIO_SPEED_FAST;		//高速GPIO_Initure.Alternate=GPIO_AF8_USART6;	//复用为USART2HAL_GPIO_Init(GPIOC,&GPIO_Initure);	   	//初始化PD9#if EN_USART6_RXHAL_NVIC_EnableIRQ(USART6_IRQn);				//使能USART1中断通道HAL_NVIC_SetPriority(USART6_IRQn,2,0);			//抢占优先级3,子优先级3#endif	}
/*+----------------GPS中断函数------------------+*/uint16_t gpsPoint=0;
uint8_t GPS_RX_BUF[150];     //接收缓冲,最大USART_REC_LEN个字节.
uint8_t gpsDataRx[150]; //传递至函数GpsBufferParsevoid USART6_IRQHandler(void)
{uint8_t res;uint32_t tmp1 = 0U, tmp2 = 0U;tmp1 = __HAL_UART_GET_FLAG(&UART6_Handler, UART_FLAG_RXNE);tmp2 = __HAL_UART_GET_IT_SOURCE(&UART6_Handler, UART_IT_RXNE);if (tmp1 != RESET && tmp2 != RESET){res = (uint8_t)(UART6_Handler.Instance -> DR & (uint8_t)0x00FFU);if(res == '$'){gpsPoint = 0;}GPS_RX_BUF[gpsPoint] = res;gpsPoint ++;if(gpsPoint > 150){gpsPoint = 0;}if(GPS_RX_BUF[0] == '$' && GPS_RX_BUF[4] == 'M' && GPS_RX_BUF[5] == 'C'){if(res == '\n'){comFuncClass.COM_UART_CLASS.cmd1_rxdone = 3; //GPS信息接收完成标志位memset(gpsDataRx, 0, 150); //清空传递变量memcpy(gpsDataRx, GPS_RX_BUF, gpsPoint); 	//保存数据memset(GPS_RX_BUF, 0, 150);      //清空临时变量}}}HAL_UART_IRQHandler(&UART6_Handler);
}

模块主板很小,带电池,断网仍可获取时间。但天线太大,要学学大疆家的天线模块,FPV上的特别紧凑。

这篇关于u-blox-M8N GNSS定位模块调试的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/607143

相关文章

C++中实现调试日志输出

《C++中实现调试日志输出》在C++编程中,调试日志对于定位问题和优化代码至关重要,本文将介绍几种常用的调试日志输出方法,并教你如何在日志中添加时间戳,希望对大家有所帮助... 目录1. 使用 #ifdef _DEBUG 宏2. 加入时间戳:精确到毫秒3.Windows 和 MFC 中的调试日志方法MFC

多模块的springboot项目发布指定模块的脚本方式

《多模块的springboot项目发布指定模块的脚本方式》该文章主要介绍了如何在多模块的SpringBoot项目中发布指定模块的脚本,作者原先的脚本会清理并编译所有模块,导致发布时间过长,通过简化脚本... 目录多模块的springboot项目发布指定模块的脚本1、不计成本地全部发布2、指定模块发布总结多模

Python中构建终端应用界面利器Blessed模块的使用

《Python中构建终端应用界面利器Blessed模块的使用》Blessed库作为一个轻量级且功能强大的解决方案,开始在开发者中赢得口碑,今天,我们就一起来探索一下它是如何让终端UI开发变得轻松而高... 目录一、安装与配置:简单、快速、无障碍二、基本功能:从彩色文本到动态交互1. 显示基本内容2. 创建链

Node.js 中 http 模块的深度剖析与实战应用小结

《Node.js中http模块的深度剖析与实战应用小结》本文详细介绍了Node.js中的http模块,从创建HTTP服务器、处理请求与响应,到获取请求参数,每个环节都通过代码示例进行解析,旨在帮... 目录Node.js 中 http 模块的深度剖析与实战应用一、引言二、创建 HTTP 服务器:基石搭建(一

python中的与时间相关的模块应用场景分析

《python中的与时间相关的模块应用场景分析》本文介绍了Python中与时间相关的几个重要模块:`time`、`datetime`、`calendar`、`timeit`、`pytz`和`dateu... 目录1. time 模块2. datetime 模块3. calendar 模块4. timeit

Python模块导入的几种方法实现

《Python模块导入的几种方法实现》本文主要介绍了Python模块导入的几种方法实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学... 目录一、什么是模块?二、模块导入的基本方法1. 使用import整个模块2.使用from ... i

无人叉车3d激光slam多房间建图定位异常处理方案-墙体画线地图切分方案

墙体画线地图切分方案 针对问题:墙体两侧特征混淆误匹配,导致建图和定位偏差,表现为过门跳变、外月台走歪等 ·解决思路:预期的根治方案IGICP需要较长时间完成上线,先使用切分地图的工程化方案,即墙体两侧切分为不同地图,在某一侧只使用该侧地图进行定位 方案思路 切分原理:切分地图基于关键帧位置,而非点云。 理论基础:光照是直线的,一帧点云必定只能照射到墙的一侧,无法同时照到两侧实践考虑:关

python: 多模块(.py)中全局变量的导入

文章目录 global关键字可变类型和不可变类型数据的内存地址单模块(单个py文件)的全局变量示例总结 多模块(多个py文件)的全局变量from x import x导入全局变量示例 import x导入全局变量示例 总结 global关键字 global 的作用范围是模块(.py)级别: 当你在一个模块(文件)中使用 global 声明变量时,这个变量只在该模块的全局命名空

深入探索协同过滤:从原理到推荐模块案例

文章目录 前言一、协同过滤1. 基于用户的协同过滤(UserCF)2. 基于物品的协同过滤(ItemCF)3. 相似度计算方法 二、相似度计算方法1. 欧氏距离2. 皮尔逊相关系数3. 杰卡德相似系数4. 余弦相似度 三、推荐模块案例1.基于文章的协同过滤推荐功能2.基于用户的协同过滤推荐功能 前言     在信息过载的时代,推荐系统成为连接用户与内容的桥梁。本文聚焦于