⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gps_module.c

📁 通过车载终端采集GPS数据
💻 C
📖 第 1 页 / 共 2 页
字号:
    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 + -