本文主要是介绍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定位模块调试的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!