在学习使用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)
hand_held.rar
(1005.84 KB, 下载次数: 29)
|