找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 5190|回復(fù): 0
收起左側(cè)

STM32 GPS NE0-7N UBLOX實驗詳解Demo代碼等

[復(fù)制鏈接]
ID:416402 發(fā)表于 2018-11-2 10:00 | 顯示全部樓層 |閱讀模式
在學(xué)習(xí)使用GPS模塊的時候把自己的一些調(diào)試經(jīng)驗和問題記錄下來,方便大家的學(xué)習(xí),也希望大家指出不足。

1.硬件實現(xiàn)平臺介紹,使用STM32F103RBT6作為核心板,使用GPS NE0-7N UBLOX模塊,串口通信模塊使用CH341串口芯片。
2.方法介紹:gps模塊采用串口通信,首先要先了解GPS的通信協(xié)議。GPS模塊通過串口給我們發(fā)的數(shù)據(jù)GPRMC格式的,他包括了定位信息,主要是經(jīng)緯度,UTC(國際標準時間)時間,等等關(guān)鍵信息,真頭由符號“$”起始。
                因為GPS使用串口通信,首先必不可少的是串口通信程序驅(qū)動的編寫,根據(jù)gps模塊的數(shù)據(jù)手冊表明,串口通信的波特率為9600,其他的一些串口通信的格式在usart.c中的My_usart2_Init函數(shù)中均有體現(xiàn)。
3.在main中的主程序,while循環(huán)中主要做了兩件事,第一就是對GPS模塊發(fā)來的幀數(shù)據(jù)進行的解析,然后把解析出的數(shù)據(jù)存儲在自己定義的結(jié)構(gòu)體中。

第二就是把這個解析后的數(shù)據(jù)進行串口的一個打印,這樣可以通過串口助手觀察當先的經(jīng)緯度等信息。

調(diào)試注意,由于GPS模塊第一次的定位搜星的事件較長,而且必須!是必須在室外進行,也就時模塊必須置于露天位置才能進行有效的定位,如果在室內(nèi)實現(xiàn)的話 是做無用功的。  下載我把代碼上傳,方便大家學(xué)習(xí),這個工程還包括了 一些LCD12854-5的驅(qū)動程序,還有一些I2C驅(qū)動指南針的程序,大家也可進行一下借鑒。

附件為code還有串口芯片ch341的串口驅(qū)動,方便大家調(diào)試我就一次都傳上去了。

單片機源程序如下:
  1. #include "stm32f10x.h"
  2. #include "usart.h"
  3. #include "lcd.h"
  4. #include "led.h"
  5. #include "math.h"
  6. #include "string.h"
  7. /************************************************
  8.                                         手持氣象臺項目
  9. ************************************************/

  10. extern QMC_BUF[8];
  11. void errorLog(int num);
  12. void parseGpsBuffer(void);
  13. void printGpsBuffer(void);

  14. int main(void)
  15. {        
  16.         int X = 0,Y = 0,Z = 0;
  17.         double Angle_XY=0,Angle_XZ=0,Angle_YZ=0;        

  18.         //設(shè)置中斷優(yōu)先級管理        
  19.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
  20.         My_Usart1_Init(115200);
  21.         My_Usart2_Init(9600);
  22.         delay_init();
  23.         GPIO_Configout();                //初始化LCD OCM12864-5
  24.         
  25.         delay_ms(200);
  26.         
  27.         Init_LEDpin();        
  28.         LED1 = 1;
  29.         //Lcd_Init();
  30.         
  31.         //QMC_5883_Init();
  32.         delay_ms(300);
  33.         while(1)
  34.         {
  35. #if 0

  36.                 Multiple_Read_Qmc5883();                //連續(xù)讀取三軸角度數(shù)據(jù),存儲在buf中
  37.                 //顯示XY軸
  38.                 X = QMC_BUF[1] << 8 | QMC_BUF[0];
  39.                 Y = QMC_BUF[3] << 8 | QMC_BUF[2];
  40.                 Z = QMC_BUF[5] << 8 | QMC_BUF[4];

  41.                 if(X > 0x7fff)
  42.                         X -= 0xffff;
  43.                 if(Y > 0x7fff)
  44.                         Y -= 0xffff;
  45.                 if(Z > 0x7fff)
  46.                         Z -= 0Xffff;
  47.                
  48.                 Angle_XY= atan2((double)Y,(double)X) * (180 / 3.14159265) + 180; //計算XY平面角度
  49.                 disp1();               
  50.                 delay_ms(400);
  51.                 delay_ms(400);               
  52.                 delay_ms(400);
  53.                 lat_disp(0xff, 0x00);               
  54.                 delay_ms(400);               
  55.                 delay_ms(400);
  56.                 delay_ms(400);
  57.                 disp3();               
  58.                 delay_ms(400);               
  59.                 delay_ms(400);
  60.                 delay_ms(400);
  61.                 lat_disp(0x33, 0x33);
  62.                 delay_ms(400);               
  63.                 delay_ms(400);
  64.                 delay_ms(400);
  65.                
  66. #else
  67.                 parseGpsBuffer();
  68.                 printGpsBuffer();

  69. #endif
  70.         }
  71. }

  72. void errorLog(int num)
  73. {
  74.         
  75.         while (1)
  76.         {
  77.                   printf("ERROR%d\r\n",num);
  78.         }
  79. }

  80. void parseGpsBuffer(void)
  81. {
  82.         char *subString;
  83.         char *subStringNext;
  84.         char i = 0;
  85.         if (Save_Data.isGetData)
  86.         {
  87.                 Save_Data.isGetData = false;
  88.                 printf("**************\r\n");
  89.                 printf(Save_Data.GPS_Buffer);

  90.                 //$GPRMC,072344.00,A,4544.41944,N,12637.19170,E,0.102,,011118,,,A*7F
  91.                 for (i = 0 ; i <= 6 ; i++)
  92.                 {
  93.                         if (i == 0)
  94.                         {
  95.                                 if ((subString = strstr(Save_Data.GPS_Buffer, ",")) == NULL)
  96.                                         errorLog(1);        //解析錯誤
  97.                         }
  98.                         else
  99.                         {
  100.                                 subString++;
  101.                                 if ((subStringNext = strstr(subString, ",")) != NULL)
  102.                                 {
  103.                                         char usefullBuffer[2];
  104.                                         switch(i)
  105.                                         {
  106.                                                 case 1:memcpy(Save_Data.UTCTime, subString, subStringNext - subString);break;        //獲取UTC時間
  107.                                                 case 2:memcpy(usefullBuffer, subString, subStringNext - subString);break;        //獲取UTC時間
  108.                                                 case 3:memcpy(Save_Data.latitude, subString, subStringNext - subString);break;        //獲取緯度信息
  109.                                                 case 4:memcpy(Save_Data.N_S, subString, subStringNext - subString);break;        //獲取N/S
  110.                                                 case 5:memcpy(Save_Data.longitude, subString, subStringNext - subString);break;        //獲取經(jīng)度信息
  111.                                                 case 6:memcpy(Save_Data.E_W, subString, subStringNext - subString);break;        //獲取E/W

  112.                                                 default:break;
  113.                                         }

  114.                                         subString = subStringNext;
  115.                                         Save_Data.isParseData = true;
  116.                                         if(usefullBuffer[0] == 'A')
  117.                                                 Save_Data.isUsefull = true;
  118.                                         else if(usefullBuffer[0] == 'V')
  119.                                                 Save_Data.isUsefull = false;

  120.                                 }
  121.                                 else
  122.                                 {
  123.                                         errorLog(2);        //解析錯誤
  124.                                 }
  125.                         }


  126.                 }
  127.         }
  128. }

  129. void printGpsBuffer(void)
  130. {
  131.         if (Save_Data.isParseData)
  132.         {
  133.                 Save_Data.isParseData = false;
  134.                
  135.                 printf("Save_Data.UTCTime = ");
  136.                 printf(Save_Data.UTCTime);
  137.                 printf("\r\n");

  138.                 if(Save_Data.isUsefull)
  139.                 {
  140.                         Save_Data.isUsefull = false;
  141.                         printf("Save_Data.latitude = ");
  142.                         printf(Save_Data.latitude);
  143.                         printf("\r\n");


  144.                         printf("Save_Data.N_S = ");
  145.                         printf(Save_Data.N_S);
  146.                         printf("\r\n");

  147.                         printf("Save_Data.longitude = ");
  148.                         printf(Save_Data.longitude);
  149.                         printf("\r\n");

  150.                         printf("Save_Data.E_W = ");
  151.                         printf(Save_Data.E_W);
  152.                         printf("\r\n");
  153.                 }
  154.                 else
  155.                 {
  156.                         printf("GPS DATA is not usefull!\r\n");
  157.                 }
  158.                
  159.         }
  160. }
復(fù)制代碼

所有資料51hei提供下載:
CH340驅(qū)動(USB串口驅(qū)動)_XP_WIN7共用.rar (324.24 KB, 下載次數(shù): 5)
hand_held.rar (1005.84 KB, 下載次數(shù): 29)


評分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復(fù) 返回頂部 返回列表