在學習使用GPS模塊的時候把自己的一些調試經驗和問題記錄下來,方便大家的學習,也希望大家指出不足。
1.硬件實現平臺介紹,使用STM32F103RBT6作為核心板,使用GPS NE0-7N UBLOX模塊,串口通信模塊使用CH341串口芯片。
2.方法介紹:gps模塊采用串口通信,首先要先了解GPS的通信協議。GPS模塊通過串口給我們發的數據GPRMC格式的,他包括了定位信息,主要是經緯度,UTC(國際標準時間)時間,等等關鍵信息,真頭由符號“$”起始。
因為GPS使用串口通信,首先必不可少的是串口通信程序驅動的編寫,根據gps模塊的數據手冊表明,串口通信的波特率為9600,其他的一些串口通信的格式在usart.c中的My_usart2_Init函數中均有體現。
3.在main中的主程序,while循環中主要做了兩件事,第一就是對GPS模塊發來的幀數據進行的解析,然后把解析出的數據存儲在自己定義的結構體中。
第二就是把這個解析后的數據進行串口的一個打印,這樣可以通過串口助手觀察當先的經緯度等信息。
調試注意,由于GPS模塊第一次的定位搜星的事件較長,而且必須!!是必須在室外進行,也就時模塊必須置于露天位置才能進行有效的定位,如果在室內實現的話 是做無用功的。 下載我把代碼上傳,方便大家學習,這個工程還包括了 一些LCD12854-5的驅動程序,還有一些I2C驅動指南針的程序,大家也可進行一下借鑒。
附件為code還有串口芯片ch341的串口驅動,方便大家調試我就一次都傳上去了。
單片機源程序如下:
- #include "stm32f10x.h"
- #include "usart.h"
- #include "lcd.h"
- #include "led.h"
- #include "math.h"
- #include "string.h"
- /************************************************
- 手持氣象臺項目
- ************************************************/
- extern QMC_BUF[8];
- void errorLog(int num);
- void parseGpsBuffer(void);
- void printGpsBuffer(void);
- int main(void)
- {
- int X = 0,Y = 0,Z = 0;
- double Angle_XY=0,Angle_XZ=0,Angle_YZ=0;
- //設置中斷優先級管理
- NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
- My_Usart1_Init(115200);
- My_Usart2_Init(9600);
- delay_init();
- GPIO_Configout(); //初始化LCD OCM12864-5
-
- delay_ms(200);
-
- Init_LEDpin();
- LED1 = 1;
- //Lcd_Init();
-
- //QMC_5883_Init();
- delay_ms(300);
- while(1)
- {
- #if 0
- Multiple_Read_Qmc5883(); //連續讀取三軸角度數據,存儲在buf中
- //顯示XY軸
- X = QMC_BUF[1] << 8 | QMC_BUF[0];
- Y = QMC_BUF[3] << 8 | QMC_BUF[2];
- Z = QMC_BUF[5] << 8 | QMC_BUF[4];
- if(X > 0x7fff)
- X -= 0xffff;
- if(Y > 0x7fff)
- Y -= 0xffff;
- if(Z > 0x7fff)
- Z -= 0Xffff;
-
- Angle_XY= atan2((double)Y,(double)X) * (180 / 3.14159265) + 180; //計算XY平面角度
- disp1();
- delay_ms(400);
- delay_ms(400);
- delay_ms(400);
- lat_disp(0xff, 0x00);
- delay_ms(400);
- delay_ms(400);
- delay_ms(400);
- disp3();
- delay_ms(400);
- delay_ms(400);
- delay_ms(400);
- lat_disp(0x33, 0x33);
- delay_ms(400);
- delay_ms(400);
- delay_ms(400);
-
- #else
- parseGpsBuffer();
- printGpsBuffer();
- #endif
- }
- }
- void errorLog(int num)
- {
-
- while (1)
- {
- printf("ERROR%d\r\n",num);
- }
- }
- void parseGpsBuffer(void)
- {
- char *subString;
- char *subStringNext;
- char i = 0;
- if (Save_Data.isGetData)
- {
- Save_Data.isGetData = false;
- printf("**************\r\n");
- printf(Save_Data.GPS_Buffer);
- //$GPRMC,072344.00,A,4544.41944,N,12637.19170,E,0.102,,011118,,,A*7F
- 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(void)
- {
- if (Save_Data.isParseData)
- {
- Save_Data.isParseData = false;
-
- printf("Save_Data.UTCTime = ");
- printf(Save_Data.UTCTime);
- printf("\r\n");
- if(Save_Data.isUsefull)
- {
- Save_Data.isUsefull = false;
- printf("Save_Data.latitude = ");
- printf(Save_Data.latitude);
- printf("\r\n");
- printf("Save_Data.N_S = ");
- printf(Save_Data.N_S);
- printf("\r\n");
- printf("Save_Data.longitude = ");
- printf(Save_Data.longitude);
- printf("\r\n");
- printf("Save_Data.E_W = ");
- printf(Save_Data.E_W);
- printf("\r\n");
- }
- else
- {
- printf("GPS DATA is not usefull!\r\n");
- }
-
- }
- }
復制代碼
所有資料51hei提供下載:
CH340驅動(USB串口驅動)_XP_WIN7共用.rar
(324.24 KB, 下載次數: 5)
2018-11-2 09:58 上傳
點擊文件名下載附件
串口驅動 下載積分: 黑幣 -5
hand_held.rar
(1005.84 KB, 下載次數: 29)
2018-11-2 13:14 上傳
點擊文件名下載附件
code 下載積分: 黑幣 -5
|