📄 gps.c
字号:
}
/*以下为GPS数据解析部分*/
temp = USART_getchar();
if(temp == '$') /*搜寻开头信息*/
{
i = 0;
while(1) /*截取语句tag*/
{
temp = USART_getchar();
if(temp != ',') /*tag结尾的','号*/
data_buffer[i++] = temp;
else break;
}
data_buffer[i] = '\0'; /*添0*/
/***************************** GPGGA 消息 **************************/
if(strcmp(data_buffer,"GPGGA\0") == 0)
{
while(USART_getchar() != ','); /*忽略时间信息,实际显示时间从GPRMC里获得*/
/*获得纬度数据 start*/
i = 3; /*前两个数据预留用于显示如 'N:'信息*/
while(1)
{
temp = USART_getchar();
if(temp == ',') /*结束*/
break;
else
{
if(i == 5)latitude[i++] = '.'; /*添加'.'*/
latitude[i++] = temp;
}
}
latitude[i] = '\0'; /*字符串结束*/
temp = USART_getchar();
if(temp != ',') /*有效数据*/
{
latitude[0] = temp; /*获得北纬还是南纬*/
//latitude[1] = ':'; /*冒号*/
temp = USART_getchar(); /*跳过接下来的','号*/
}
/*获得纬度数据 end*/
/*获得经度数据 start*/
i = 2; /*前两个数据预留用于显示如 'E:'信息*/
while(1)
{
temp = USART_getchar();
if(temp == ',') /*结束*/
break;
else
{
if(i == 5)longitude[i++] = '.'; /*添加'.'*/
longitude[i++] = temp;
}
}
longitude[i] = '\0'; /*字符串结束*/
temp = USART_getchar();
if(temp != ',') /*有效数据*/
{
longitude[0] = temp; /*获得北纬还是南纬*/
//longitude[1] = ':'; /*冒号*/
temp = USART_getchar(); /*跳过接下来的','号*/
}
/*获得经度数据 end*/
/*获的质量因子 start*/
temp = USART_getchar();
if(temp != ',') /*有效数据*/
{
fix_valid = temp-0x30; /*转ASCII到实际二进制数据*/
temp = USART_getchar(); /*跳过接下来的','号*/
}
else fix_valid = 0;
/*获的质量因子 end*/
/*获得可使用的卫星数 start*/
temp = USART_getchar();
if(temp != ',')
{
total_statlites_useful[0] = temp;
total_statlites_useful[1] = USART_getchar();
total_statlites_useful[2] = '\0';
temp = USART_getchar(); /*跳过接下来的','号*/
}
else
{
total_statlites_useful[0] = '0';
total_statlites_useful[1] = '0';
total_statlites_useful[2] = '\0';
}
/*获得可使用的卫星数 end*/
while(USART_getchar() != ','); /*忽略水平定为精度信息*/
/*获得天线高度 start*/
i = 2;
//altitude[i++] = 'A';
//altitude[i++] = ':';
while(1)
{
temp = USART_getchar();
if(temp == ',') /*结束*/
break;
else
altitude[i++] = temp;
}
temp = USART_getchar();
if(temp != ',') /*有效数据*/
{
altitude[i++] = temp; /*获得单位*/
temp = USART_getchar(); /*跳过接下来的','号*/
}
altitude[i] = '\0'; /*字符串结束*/
/*获得天线高度 end*/
}
/******************************* GPGSV 消息 *******************************/
else if(strcmp(data_buffer,"GPGSV\0") == 0)
{
/*获得语句条数 start*/
temp = USART_getchar();
if(temp != ',') /*有效数据*/
{
total_gpgsv_no = temp - '0';
temp = USART_getchar(); /*跳过接下来的','号*/
}
else total_gpgsv_no = 0;
/*获得语句条数 end*/
/*获得当前语句编号 start*/
temp = USART_getchar();
if(temp != ',') /*有效数据*/
{
current_gpgsv_index = temp - '0';
temp = USART_getchar(); /*跳过接下来的','号*/
}
else current_gpgsv_index = 1;
if(current_gpgsv_index == 1) /*清数据,重新统计*/
{
total_statlites_have_signal[0] = '0';
total_statlites_have_signal[1] = '0';
total_statlites_have_signal[2] = '\0';
}
/*获得当前语句编号 end*/
#if 1
/*获得可视卫星总数 start*/
temp = USART_getchar();
if(temp != ',')
{
total_statlites_visable[0] = temp;
total_statlites_visable[1] = USART_getchar();
total_statlites_visable[2] = '\0';
temp = USART_getchar(); /*跳过接下来的','号*/
}
else
{
total_statlites_visable[0] = '0';
total_statlites_visable[1] = '0';
total_statlites_visable[2] = '\0';
}
/*获得可视卫星总数 end*/
#else
while(USART_getchar() != ','); /*忽略可视卫星总数*/
#endif
/*获得可视卫星参数 start*/
for(i=0;i<4;i++) /*没条语句包含四颗卫星数据*/
{
while(USART_getchar() != ','); /*忽略卫星号*/
while(USART_getchar() != ','); /*忽略卫星仰角*/
while(USART_getchar() != ','); /*忽略卫星方位*/
temp = USART_getchar(); /*卫星信噪比*/
if((temp != ',') && (temp != '*'))
{
temp += USART_getchar() - '0';
if((temp > '0')) /*不为0代表这个卫星有信号*/
{
if(total_statlites_have_signal[1] != '9')
total_statlites_have_signal[1] += 1;
else
{
total_statlites_have_signal[0] += 1;
total_statlites_have_signal[1] = '0';
}
}
temp = USART_getchar(); /*跳过接下来的','号*/
}
}
/*获得可视卫星参数 end*/
}
/********************************* GPRMC 消息 ***********************************/
else if(strcmp(data_buffer,"GPRMC\0") == 0) /*从这个信息里获得时间*/
{
//debug("found tag GPRMC");
i = 0;
while(1)
{
temp = USART_getchar();
if(temp == ',') /*结束*/
break;
else
{
if((i == 2) || (i == 5))time[i++] = ':'; /*添加'.'*/
time[i++] = temp;
}
}
time[i] = '\0'; /*字符串结束*/
need_update = 1; /*可以更新数据*/
/*查询数据是否有效*/
temp = USART_getchar();
if(temp != ',')
{
if(temp == 'A')
{
gprmc_valid = 1;
}
else gprmc_valid =0;
temp = USART_getchar();
}
else gprmc_valid = 0;
/*如果有效则继续收集速度和方位角信息*/
if(gprmc_valid == 1)
{
while(USART_getchar() != ','); /*忽略纬度*/
while(USART_getchar() != ','); /*忽略南北*/
while(USART_getchar() != ','); /*忽略经度*/
while(USART_getchar() != ','); /*忽略东西*/
i = 3;
while(1) /*获得速度信息*/
{
temp = USART_getchar();
if(temp == ',')break;
else speed[i++] = temp;
}
speed[i++] = ' ';
speed[i++] = 'M';
speed[i++] = 'P';
speed[i++] = 'H';
speed[i] = '\0';
i = 7;
while(1) /*获得方向信息*/
{
temp = USART_getchar();
if(temp == ',')break;
else angle[i++] = temp;
}
angle[i++] = '\'';
angle[i++] = '\0';
}
else /*数据无效时,全部置零*/
{
speed[3] = '0';
speed[4] = '.';
speed[5] = '0';
speed[6] = ' ';
speed[7] = 'M';
speed[8] = 'P';
speed[9] = 'H';
speed[10] = '\0';
angle[7] = '0';
angle[8] = '.';
angle[9] = '0';
angle[10] = '\'';
angle[11] = '\0';
}
}
}
}
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -