Ublox 初探--获取经纬度信息

本文介绍如何使用UbloxNEO-7GPS模块获取经纬度信息,并对比NMEA、RTCM3及UBX协议特点。通过配置UBX-NVA-POSLLH指令,实现了高效的数据获取。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

先说一下主要是做了些什么,便于理解。

Ublox模块能获取到经纬度等信息,上电后便按照设定的数据格式通过既定的接口不停的往外吐数据(1Hz?)
我们要做的就是接收并解析这些数据来获得我们需要的数据。

工具资料分享

硬件环境:Ublox NEO-7 GPS
数据接口:USRT(查资料还看到可以用SPI的,传送门
协议分析:手边有一份协议分析的资料
测试软件:u-Center

我是怎么做的

目标是获取经纬度的参数。
百度到的大部分都是使用NMEA协议,找到NMEALIB的代码看了半天大概理解了这种协议的格式,感觉这种格式更适合于给人看,而不是给MCU做处理。
在U-center里面,View–Message View里面能看到和设置协议,输出格式等。
看到下面的UBX,便使用协议分析的文档看了一下UBX的数据格式,搜索能输出经纬度信息的指令,选中了UBX-NVA-POSLLH。
这里写图片描述
设置好需要的格式之后。
在UBX-CFG-CFG里选中Save current configuration,然后Send保存即可。

总结

对于NMEA,UBX,RTCM的理解:
NMEA:资料比较全,但数据量大,分析困难,适用于上位机X86
RTCM3:没接触..
UBX:比较灵活,适用于嵌入式平台,解析数据方便。

### 关于Ublox NEO-M8N模块连接至STM32微控制器 #### 硬件连接说明 为了实现GPS功能,通常会采用串口通信的方式将Ublox NEO-M8N模块与STM32相连。硬件连接主要包括VCC、GND以及TXD和RXD四个引脚之间的对接[^1]。 - VCC (电源正极) 和 GND (接地线) 需要分别接到STM32开发板上的相应供电端子上; - TXD (传输数据) 应该连到MCU的接收引脚(RXD),而RXD则对应着发送引脚(TXD)[^1]; 对于具体的针脚定义,在官方的手册中有详细的描述可以作为参考依据。 #### 软件配置指导 当完成物理层面的链接之后,则需进一步设置软件环境来确保两者间能够正常通讯: - 使用标准UART库函数初始化串行接口参数,比如波特率设定为9600bps, 数据位设为8bit, 奇偶校验关闭等常规选项[^4]; ```c // UART Initialization Code Example void MX_USART1_UART_Init(void) { huart1.Instance = USART1; huart1.Init.BaudRate = 9600; // Set baud rate to match the GPS module's default setting. huart1.Init.WordLength = UART_WORDLENGTH_8B; huart1.Init.StopBits = UART_STOPBITS_1; huart1.Init.Parity = UART_PARITY_NONE; huart1.Init.Mode = UART_MODE_TX_RX; huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE; huart1.Init.OverSampling = UART_OVERSAMPLING_16; if (HAL_UART_Init(&huart1) != HAL_OK) { Error_Handler(); } } ``` 此外,还可以利用`U-Center`工具来进行更深入细致的各项参数调整,或是直接向设备写入特定指令以达到同样的效果。 #### 示例程序片段 下面给出一段简单的C语言代码用于读取来自GPS模组的数据流,并将其打印出来供调试用途: ```c #include "stm32f1xx_hal.h" UART_HandleTypeDef huart1; char buffer[256]; int main(void){ /* Initialize all configured peripherals */ SystemClock_Config(); MX_GPIO_Init(); MX_USART1_UART_Init(); while(1){ uint8_t data; if(HAL_UART_Receive(&huart1,&data,1,10)!=HAL_OK){continue;} printf("%c",data); if(data=='\n'){ printf("\r\nReceived Data:\r\n%s\r\n",buffer); memset(buffer,'\0',sizeof(buffer)); }else{ strncat(buffer,(const char*)&data,strlen((const char*)&data)); } } } ``` 此段代码实现了基本的功能——即从串口中获取字符直至遇到换行符为止,随后把整条消息显示在终端界面上以便观察解析结果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值