STM32F429+NEO -7N(GPS模塊)輸出地理位置信息

利用GPS定位在生活中並不少見,下面就記錄一下自己使用GPS獲取地理位置的過程。

目錄

  • 實驗前準備
  • NEO-7N GPS模塊簡介
  • USB轉TTL調試模塊
  • STM32獲取GPS數據
  • GPS數據解析

實驗前準備

  • STM32F429開發板
  • USB轉TTL模塊
  • NEO-7N GPS模塊
  • 串口調試助手

NEO-7N簡介

NEO-7N GPS 模塊,具有高靈敏度、低功耗、小型化、極高追蹤靈敏度等特點,大大擴大了其定位的覆蓋面,在普通GPS 接收模塊不能定位的地方,如狹窄都市天 空下 、 密集的叢林環境, NEO-7N 都能高精度定位。模塊的高靈敏度、小靜態漂移、 低功耗及輕巧的體積,適用於車 載 、手持設備如 PDA,車輛監控、手 機、攝像機及其他移動定位系統的應用。
在這裏插入圖片描述
USB轉TTL調試模塊

從上圖可以看到,GPS模塊是通過串口傳輸數據的,因此可以直接接USB轉TTL模塊調試,接線如下:
GPS---->USB-TTL
VCC ----> VCC
GND----> GND
TXD ----> RXD
RXD----> TXD

這裏還要注意的是:GPS的波特率要選取9600
在這裏插入圖片描述
GPS模塊稍微需要點時間工作,通常10分鐘內獲取到原始數據,還要注意的是:要把該模塊放置在室外,不然接收不到GPS信號,建議外接天線,3米那種。 上圖就是獲取到的原始GPS數據,我們只需要關注以$GPRMC開頭的這一組數據。

STM32獲取GPS數據

既然GPS的數據輸出是通過串口實現的,那麼就可以通過配置STM32的串口來讀取GPS數據。但是串口獲得的原始數據這麼多,要怎麼才能得到我們想要的數據呢?上文所提到的關注的那一組數據,就是我們需要的數據。我們可以從串口開始數據解析,當串口識別到$GPRMC標識符的幾個標識符號就能認爲這是我們需要的數據,把該數據保存下來數組才能做後面的進一步處理。這裏我使用了32上的串口3函數實現如下:

void USART3_IRQHandler(void)
{
	u8 Res;	      
	if(__HAL_UART_GET_FLAG(&UART3_Handler,UART_FLAG_RXNE)!=RESET)//接收到數據
	{	 
		HAL_UART_Receive(&UART3_Handler,&Res,1,1000);//讀取到接收數據
        if(Res=='$')//讀取到的值爲'$'
        {
            point1=0;//指定位置爲第0個字節
        }
        
        USART3_RX_BUF[point1++]=Res;
        if(USART3_RX_BUF[0] == '$' && USART3_RX_BUF[4] == 'M' && USART3_RX_BUF[5] == 'C')			//確定是否收到"GPRMC/GNRMC"這一幀數據
	{
		if(Res == '\n')									   
		{
			memset(Save_Data.GPS_Buffer, 0, GPS_Buffer_Length);      //清空
			memcpy(Save_Data.GPS_Buffer, USART3_RX_BUF, point1); 	//保存數據
			Save_Data.isGetData = true;
			point1 = 0;
			memset(USART3_RX_BUF, 0, USART3_MAX_RECV_LEN);      //清空				
		}	
				
	}
	
	if(point1 >= USART3_MAX_RECV_LEN)
	{
		point1 = USART3_MAX_RECV_LEN;
	}
	}  				 											 
}

當保存了我們需要的數據後,就開始試着輸出該組數據,觀察$GPRMC這一組數據,都是通過“,”分隔符來區別下一個數據的,因此可以通過判斷“,”的位置來確定數據。

void parseGpsBuffer()
{
	char *subString;
	char *subStringNext;
	char i = 0;
	if (Save_Data.isGetData)
	{
		Save_Data.isGetData = false;
		printf("**************\r\n");
		printf("%s",Save_Data.GPS_Buffer);

		
		for (i = 0 ; i <= 6 ; i++)
		{
			if (i == 0)
			{
				if ((subString = strstr(Save_Data.GPS_Buffer, ",")) == NULL)
					errorLog(1);	//解析錯誤
			}
			else
			{
				subString++;
				if ((subStringNext = strstr(subString, ",")) != NULL)
				{
					char usefullBuffer[2]; 
					switch(i)
					{
						case 1:memcpy(Save_Data.UTCTime, subString, subStringNext - subString);break;	//獲取UTC時間
						case 2:memcpy(usefullBuffer, subString, subStringNext - subString);break;	//獲取UTC時間
						case 3:memcpy(Save_Data.latitude, subString, subStringNext - subString);break;	//獲取緯度信息
						case 4:memcpy(Save_Data.N_S, subString, subStringNext - subString);break;	//獲取N/S
						case 5:memcpy(Save_Data.longitude, subString, subStringNext - subString);break;	//獲取經度信息
						case 6:memcpy(Save_Data.E_W, subString, subStringNext - subString);break;	//獲取E/W

						default:break;
					}

					subString = subStringNext;
					Save_Data.isParseData = true;
					if(usefullBuffer[0] == 'A')
						Save_Data.isUsefull = true;
					else if(usefullBuffer[0] == 'V')
						Save_Data.isUsefull = false;

				}
				else
				{
					errorLog(2);	//解析錯誤
				}
			}


		}
	}
}

爲了讓數據好看些,方便辨認,再通過一個函數讓這些數據“排隊輸出”:

void printGpsBuffer()
{  
	if (Save_Data.isParseData)
	{
		Save_Data.isParseData = false;
		
		printf("Save_Data.UTCTime = %s\r\n",Save_Data.UTCTime);

		if(Save_Data.isUsefull)
		{          
			Save_Data.isUsefull = false;
			printf("Save_Data.latitude = %s\r\n",Save_Data.latitude);
			printf("Save_Data.N_S = %s\r\n",Save_Data.N_S);

			printf("Save_Data.longitude = %s\r\n",Save_Data.longitude);
			printf("Save_Data.E_W = %s\r\n",Save_Data.E_W);
            
            printf("the result longtitude is %s\r\n",longitudeToOnenetFormat(Save_Data.longitude));
            printf("the result latitude is %s\r\n",latitudeToOnenetFormat(Save_Data.latitude));
            //trans_result(Save_Data.longitude,Save_Data.latitude);
		}
		else
		{
			printf("GPS DATA is not usefull!\r\n");
		}
		
	}
}

在這裏插入圖片描述
上圖長的一串數據就是提取的GPRMC數據,該行後面輸出的就是分類後的數據。把獲取到的經緯度值在地圖輸入,可以看到具體的位置了,還挺準確的,提供某寶資料附帶的測試軟件:wn6s

GPS數據解析

當然,上面輸出的經緯度不是常見的GBS84地圖值,因此還可以把數據再進行轉換,得到我們想要的數據,這裏不貼代碼,提供一個思路:就是把GPRMC的值的整數部分和小數部分拆開,儲存在數組裏面再換算。
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章