📄 gps_module.c
字号:
uchar n=0;
uchar altitude_array[10];
uchar *gps_altitude_data=altitude_array;
if(GPS_OK==get_sub_str(gps_buff, comma, gps_altitude_data))
{
if(*gps_altitude_data==0) /*当两个逗号之间是空时,赋值为0,防止赋随机值*/
{
*gps_altitude='\0';
}
else /*当两个逗号之间是正确数据时,正常处理*/
{
for(i=0;i<4;i++) /*高度数值最多由4个字符组成*/
{
if (*gps_altitude_data=='.') /*当遇到小数点时*/
{
point=1;
gps_altitude_data++;
continue;
}
if (!point) /*遇到小数点前的计算*/
{
*gps_altitude=((*gps_altitude)*10)+((*gps_altitude_data)-0x30);
}
else if (n<1) /*遇到小数点后并保留一位小数的计算*/
{
*gps_altitude=((*gps_altitude)*10)+((*gps_altitude_data)-0x30);
n++;
}
gps_altitude_data++;
}
}
return GPS_OK;
}
else
{
return GPS_ERROR;
}
}
/********************************************************************************
*
* 函数功能:取出GPS字符串中卫星数量部分
* 输入 :GPS字符串数据
* 输出 :卫星个数
* 数据包 :GPGGA
*
********************************************************************************/
int get_satelt_num(uchar *gps_buff, uchar *satelt_number)
{
uchar comma=7;
uchar i=0;
uchar satellite_array[10];
uchar *satelt_number_data=satellite_array;
if(GPS_OK==get_sub_str(gps_buff, comma, satelt_number_data))
{
for (i=0;i<2;i++)
{
*satelt_number=(*satelt_number)*10+((*satelt_number_data)-0x30);
satelt_number_data++;
}
return GPS_OK;
}
else
{
return GPS_ERROR;
}
}
/****************************************************************************************
*
* 函数功能:提取速度数据
* 输入 :GPS速度数据
* 输出 :海里/小时的速度值
* 数据包 :GPRMC
* 修改日期:2006-5-8
* 修改内容:将速度单位 厘米/秒(最大误差36米/小时)又转换成(节/小时),即保持数据的原始单位
****************************************************************************************/
int get_speed(uchar *gps_buff, uint *gps_speed)
{
uchar comma=7;
int point=0;
uchar i=0;
uchar n=0;
// ulong mid_speed=0;
uchar speed_array[10];
uchar *gps_speed_data=speed_array;
if(GPS_OK==get_sub_str(gps_buff, comma, gps_speed_data))
{
if(*gps_speed_data==0) /*当两个逗号之间是空时,赋值为0,防止赋随机值*/
{
*gps_speed='\0';
}
else /*当两个逗号之间是正确数据时,正常处理*/
{
for(i=0;i<6;i++)
{
if (*gps_speed_data=='.')
{
point=1;
gps_speed_data++;
continue;
}
if (!point) /*小数点前的运算*/
{
*gps_speed=((*gps_speed)*10)+((*gps_speed_data)-0x30);
}
else /*小数点后的运算*/
{
if (n<2) /*对小数点后两位小数进行处理*/
{
*gps_speed=((*gps_speed)*10)+((*gps_speed_data)-0x30);
n++;
}
}
gps_speed_data++;
}
// mid_speed=(mid_speed)*514/1000; /*先除以100回复两位小数,再乘以(514/10)转换为厘米/秒*/
// *gps_speed=(uint)mid_speed; /*把ulong型强制转换为uint型,输出*/
}
return GPS_OK;
}
else
{
return GPS_ERROR;
}
}
/********************************************************************************
*
* 函数功能:取出GPS字符串中指定位置的一个逗号与下一个逗号间的子串(GPS_SUB_STR)
* 输入 :GPS字符串数据
* 输出 :指定位置的逗号与下一个逗号之间的子串
* 数据包 :所有类型的包格式
*
********************************************************************************/
/*修改"找第几个数据的函数" 2006-4-3 24:20*/
int get_sub_str(uchar *gps_buff, int first_comma, uchar *gps_sub_str)
{
uchar i=0;
int comma_currrent=0;
if((*gps_buff=='$')&&(first_comma>0))
{
while(i<GPS_DATA_MAXLEN)
{
i++;
gps_buff+=1;
if(','==*gps_buff) /*数逗号*/
{
comma_currrent+=1;
}
if(first_comma==comma_currrent) /*当找到要找的第几个逗号后,也就找到了要找的数据*/
{
gps_buff+=1;
while(','!=*gps_buff) /*在遇到下一个逗号之前的数据,即是要找的数据*/
{
*gps_sub_str=*gps_buff;
gps_sub_str++;
gps_buff++;
}
*gps_sub_str='\0';/*接收完要接收的数据(经度或纬度等)后,赋值零,表示接收完毕*/
break; /*加break,使找到所要的数据后跳出循环 2006-4-4 11:04*/
}
}
return GPS_OK;
}
else
{
return GPS_ERROR;
}
}
/********************************************************************************
*
* 函数功能:当收到GPS数据包时,调用gps_mod()函数
*
********************************************************************************/
char gps_process(void)
{
static char data init=0;
unsigned int tmp;
char *gpsPtr;
int i=0;
if(gps_receive_flg==0) return 0;
if( !init )
{
memset(&gps_struct, 0, sizeof(gps_struct));
init = 1;
uart1_init();
}
tmp = get_gps_packet(&gpsPtr); /*得到缓冲区中一整串字符的长度*/
if( tmp )
{
gps_struct.valid = 0;
*(gpsPtr+tmp) = 0; /*当缓冲区中的一整串数据接收完毕时,加零表示接收结束*/
while(*gpsPtr!=0x00) /*一直循环,直到遇到0*/
{
if (*gpsPtr=='$') /*如果找到'$',继续后移,并给gps_buff[0]赋以'$'*/
{
gpsPtr+=1;
gGps_buff[0]='$';
i+=1;
while (*gpsPtr!='$'&& (i<GPS_DATA_MAXLEN))/*在遇到下一个'$'符号之前,一直填充 gps_buff[i]*/
{
gGps_buff[i]=*gpsPtr;
i++;
gpsPtr++;
}
if(GPS_ERROR==gps_mod(gGps_buff))/*调用此函数,对收到的一小串数据进行处理*/
{
return(0);
}
i=0;
}
else
{
gpsPtr++;/*如果未找到'$',一直找'$'*/
}
}
enable_rcv_gps();/*接收完一整串数据后,对串口进行清零*/
}
return(tmp);
}
/********************************************************************************
*
* 函数功能:调用以上所有函数,并填充结构体GPS_DATA
*
********************************************************************************/
extern unsigned char gps_str[80];
int gps_mod(uchar *gps_buff)
{
uint tmp_alti_spe_dir=0;
if(GPS_OK==gps_chk(gps_buff)) /*如果校验和正确*/
{
if(get_format(gps_buff)==GPRMC) /*判断出某种协议格式*/
{
get_gps_state(gps_buff, &(gps_string.valid));
if(gps_string.valid!='A')
return GPS_ERROR;
memset(gps_str,0,80);
if(station_key==1)
{
station_key=0;
memcpy(gps_str+2,gps_buff,strlen(gps_buff));
if(cur_direction==24)
{
gps_str[0]=(gps_8line[cur_line].station_counter_up+1)/10+'0';
gps_str[1]=(gps_8line[cur_line].station_counter_up+1)%10+'0';
gps_8line[cur_line].station_counter_up++;
gps_8line[cur_line].gps_counter_up++;
}
else if(cur_direction==25)
{
gps_str[0]=(gps_8line[cur_line].station_counter_down+1)/10+'0';
gps_str[1]=(gps_8line[cur_line].station_counter_down+1)%10+'0';
gps_8line[cur_line].station_counter_down++;
gps_8line[cur_line].gps_counter_down++;
}
//保存数据和结构体
//
}
else if(corner_key==1)
{
corner_key=0;
gps_str[0]='9';
gps_str[1]='9';
memcpy(gps_str+2,gps_buff,strlen(gps_buff));
if(cur_direction==24)
{
gps_8line[cur_line].corner_counter_up++;
gps_8line[cur_line].gps_counter_up++;
}
else if(cur_direction==25)
{
gps_8line[cur_line].corner_counter_down++;
gps_8line[cur_line].gps_counter_down++;
}
//保存数据和结构体
//
}
else
{
memcpy(gps_str,gps_buff,strlen(gps_buff));
if(cur_direction==24)
{
gps_8line[cur_line].gps_counter_up++;
}
else if(cur_direction==25)
{
gps_8line[cur_line].gps_counter_down++;
}
//保存数据和结构体
//
}
savegpstoflash();
get_sub_str(gps_buff, 3, gps_string.latitude); /*得到纬度*/
get_sub_str(gps_buff, 5, gps_string.longitude); /*得到经度*/
tmp_alti_spe_dir=0; /*高度、速度、方向共用一个变量,用后清零*/
get_speed(gps_buff, &tmp_alti_spe_dir); /*得到速度*/
gps_string.speed[0]=(tmp_alti_spe_dir*18)/1000/10+'0';
gps_string.speed[1]=(tmp_alti_spe_dir*18)/1000%10+'0';
gps_string.speed[2]=0;
gps_string.valid='A';
return GPS_OK;
}
gps_string.valid='V';
return GPS_ERROR;
}
else
{
gps_string.valid='V';
return GPS_ERROR;
}
}
/********************************************************************************
*
* 函数功能:将结构体所有成员置零
*
********************************************************************************/
void get_gps_data(GPS_DATA **ptr)
{
if( gps_struct.valid == 0x41 )
gps_struct.valid = 0x41;
else
gps_struct.valid = 0;
*ptr = &gps_struct;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -