找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4470|回复: 0
收起左侧

STM32 GPS NE0-7N UBLOX实验详解Demo代码等

[复制链接]
ID:416402 发表于 2018-11-2 10:00 | 显示全部楼层 |阅读模式
在学习使用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的串口驱动,方便大家调试我就一次都传上去了。

单片机源程序如下:
  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.         //设置中断优先级管理        
  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();                //连续读取三轴角度数据,存储在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;        //获取经度信息
  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. }
复制代码

所有资料51hei提供下载:
CH340驱动(USB串口驱动)_XP_WIN7共用.rar (324.24 KB, 下载次数: 5)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表