GPS模块介绍
GPS模块是基于ATGM336H-5N的高性能BDS/GNSS定位导航模块。模块支持多种卫星导航系统,包括中国的北斗二号和北斗三号全部卫星,美国的GPS,俄罗斯的GLONASS,日本的QZSS,可以同时接收以上卫星导航系统的卫星信号,并且实现联合定位、导航与授时,模块具有高灵敏度、低功耗、低成本等优势,适用于车载导航、手持定位、可穿戴设备。
效果展示
使用注意事项
要将天线放在室外使用,模块上电后大概半分钟就会输出信息
实物图
接线方式
STM32 GPS
VCC ------> VCC
GND ------> GND
PA10 <------ TXD
STM32 0.96oled
VCC ------> VCC
GND ------> GND
PB9 ------> SDA
PB8 ------> SCL
主要代码
接受并解析gps的信息
void errorLog(int num)
{
while (1)
{
printf("ERROR%d\r\n",num);
}
}
void parseGpsBuffer()
{
char *subString;
char *subStringNext;
char i = 0;
if (Save_Data.isGetData)
{
Save_Data.isGetData = false;
printf("**************\r\n");
printf(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); //解析错误
}
}
}
}
}
// GPS数据转化单位为度。
double Convert_to_degrees(char* data)
{
double temp_data = atof(data);
int degree = (int)(temp_data / 100);
double f_degree = (temp_data / 100.0 - degree)*100/60.0;
double result = degree + f_degree;
return result;
}
void printGpsBuffer()
{
double f_latitude = 0.0;
double f_longitude = 0.0;
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("--");
f_latitude = Convert_to_degrees(Save_Data.latitude);
printf("%lf%s", f_latitude, Save_Data.N_S);
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("--");
f_longitude = Convert_to_degrees(Save_Data.longitude);
printf("%lf%s", f_longitude, Save_Data.E_W);
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");
}
}
}
oled代码使用的江协科技代码
江协科技/江科大-STM32入门教程-8.示例程序(OLED驱动函数)、keil的调试模式_oledshownum函数-优快云博客
完整代码见我的资源