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

📄 gps_handle.c

📁 C语言源代码及相关资料
💻 C
📖 第 1 页 / 共 2 页
字号:
/****************************************Copyright (c)**************************************************
** Modified by: 
** Modified date:
** Version:	
** Descriptions: 
**
********************************************************************************************************/


#include "config.H"

#define __AMOD_GPS_PARSER

char * startchar(char * str,char endch );
uint16 StrTOUINT(char * str,uint8 DBits);

/*******************************************************************************************
** Function name:      weekdayGet
** Descriptions:       根据输入的日期,计算该日期对应的星期数。
** Input parameters:  uiYear   年
                       uiMonth  月
                       uiDay    日    
** Output parameters: 无
** Returned value:     对应的星期数
*******************************************************************************************/
INT32U weekdayGet(INT32U uiYear,INT32U uiMonth,INT32U uiDay)   
{   
    INT32U  uiDays[12] = {31,59,90,120,151,181,212,243,273,304,334,365};   
    INT32U  uiNum;
    uiNum = (INT32U)((uiYear-1L)*365 + uiDay + (uiYear-1L)/4 - (uiYear-1L)/100 + (uiYear-1L)/400);   
    if(uiMonth > 1)   
        uiNum+=uiDays[uiMonth-2];   
    if((uiMonth > 2)&&(uiYear%4==0&&uiYear%100!=0||uiYear%400==0))   
        uiNum++;   
    return   uiNum % 7;   
}   



GPS_DATA_TYPE	GPS_DATA;
//GPS故障后,置相关信息
uint8	Reset_GPS_DATA(RTC_DATETIME	*	dateTime)
{
	GPS_DATA.Time.Flag=0;	//故障
	
	GPS_DATA.Time.Hour = (uint8)(dateTime->Time_hour); 
	GPS_DATA.Time.Min = (uint8)(dateTime->Time_min); 
	GPS_DATA.Time.Sec = (uint8)(dateTime->Time_sec); 
	GPS_DATA.Time.ms = 0; //.sss
	GPS_DATA.Time.Day = (uint8)(dateTime->Time_day);
	GPS_DATA.Time.Mon = (uint8)(dateTime->Time_month);
	GPS_DATA.Time.Year = (uint8)(dateTime->Time_year-2000);
	GPS_DATA.Time.Week=(uint8)(dateTime->Time_week);

	//GPS_DATA.Latitude;
	//GPS_DATA.Longitude;
	GPS_DATA.Altitude=0;
	GPS_DATA.HDOP=0;
	GPS_DATA.VDOP=0;
	GPS_DATA.StlUsed=0;
	//////////GPS_DATA.Satellite[MAXSATELLITE];
	GPS_DATA.Speed=0;
	//GPS_DATA.Direction;
	GPS_DATA.Status=0;
	
	return	TRUE;
	
}

// Chad
char gw_tempout[128];

#if !defined(__AMOD_GPS_PARSER)

uint8	recv_GPS_data(char * temp, uint16 uiNum)
{	
	char *tempstr=NULL;
	char *p=NULL,*pp=NULL,*ppp=NULL;
	char * str_flag[2]={"$GPGGA","$GPRMC"};
	//unsigned short shRtnNum = 0 ;
	
	
	pp=temp;
// Chad: Add to display
	//__DBG3_printf2(pp, uiNum);
	//sprintf(gw_tempout,"\r\n===GPS: (%d:%d)===\r\n", uiNum, shRtnNum);
	//__DBG3_printf1(gw_tempout);
	
	while((p=strstr(pp,"$"))!=NULL)
	{
		if ((ppp=strstr(p+1,"$"))!=NULL)
		{
			// Chad
			//__DBG3_printf2(p, ppp-p);
							
			if ((ppp-p)>=50)
			{
				static char buff[TRANSINFOLEN/2];
				uint16	dataLen=0;
				
				
				dataLen=(uint16)(ppp-p);
				
				// Chad
				//__DBG3_printf2(p, dataLen);
				
				memset(buff,0,sizeof(buff));
				//////////memmove(buff,p,ppp-p);
				if(dataLen>TRANSLEN/2)	return	FALSE;
				memcpy(buff,p,dataLen);
// Chad: Remove
//				uartWrite(UART3,(uint8	*)buff,dataLen,NULL); 	//测试
				//__DBG3_printf2(buff, dataLen);
				//OSSchedLock();
// Chad: Add
				//sprintf(gw_tempout,"\r\n===GPS===\r\n");
				//uartWrite(UART3,(uint8	*)gw_tempout,strlen(gw_tempout),NULL); 	//测试				
				if(strstr(buff,str_flag[0])!=NULL && strstr(buff,"\r\n")!=NULL)
				{
				   tempstr=buff;
				   
				// Chad
					__DBG3_printf2(tempstr, dataLen);
				   
					startchar(tempstr,',');
					tempstr = tempstr+strlen(str_flag[0])+1;//$GPGGA,
					//UTC
					startchar(tempstr,',');
					GPS_DATA.Time.Hour = (uint8)(StrTOUINT(tempstr,2)); 
					GPS_DATA.Time.Min = (uint8)(StrTOUINT(tempstr+2,2)); 
					GPS_DATA.Time.Sec = (uint8)(StrTOUINT(tempstr+4,2)); 
					GPS_DATA.Time.ms = StrTOUINT(tempstr+7,strlen(tempstr+7)); //.sss
					tempstr = tempstr + strlen(tempstr)+1;//hhmmss.sss,
					//Latitude
					GPS_DATA.Latitude.dd = (uint8)(StrTOUINT(tempstr,2)); 
					GPS_DATA.Latitude.mm = (uint8)(StrTOUINT(tempstr+2,2)); 
					GPS_DATA.Latitude.mmmm = StrTOUINT(tempstr+5,4);//.mmmm
					tempstr = tempstr + 11;//ddmm.mmmm,							<--- should 11 ublox
					//N/S Latitude
					GPS_DATA.Latitude.Indicator = tempstr[0];
					tempstr = tempstr + 2;//N,
					//Longitude
					GPS_DATA.Longitude.ddd = StrTOUINT(tempstr,3); 
					GPS_DATA.Longitude.mm = (uint8)(StrTOUINT(tempstr+3,2)); 
					GPS_DATA.Longitude.mmmm = StrTOUINT(tempstr+6,4);//.mmmm
					tempstr = tempstr + 12;//dddmm.mmmm,							<--- should 12 ublox
					//E/W Longtitude
					GPS_DATA.Longitude.Indicator = tempstr[0];
					tempstr = tempstr + 2;//E,
					//Fix Indicator
					GPS_DATA.Status = (uint8)(StrTOUINT(tempstr,1) << 4);
					tempstr = tempstr + 2;//1,
					//Satellites Used
					GPS_DATA.StlUsed = (uint8)(StrTOUINT(tempstr,2));
					tempstr = tempstr + 3;//07,
					//HDOP
					tempstr = startchar( tempstr,',' );
					GPS_DATA.HDOP = (uint8)( StrTOUINT(tempstr, strlen(tempstr)-1) );	
					tempstr = tempstr+strlen(tempstr) + 1;//1.0,
					//Altitude
					tempstr = startchar( tempstr,',' );
					if((p=strchr(tempstr,'.'))!=NULL)
						tempstr[p-tempstr]='\0';
					if(tempstr[0] ==  '-' )//负数
					{
						tempstr++;
						GPS_DATA.Altitude = StrTOUINT(tempstr, strlen(tempstr));
						//GPS_DATA.Altitude = 0-GPS_DATA.Altitude;
						GPS_DATA.Altitude|=0x8000;
					}
					else
					{
						GPS_DATA.Altitude = StrTOUINT(tempstr, strlen(tempstr));
						GPS_DATA.Altitude&=(~0x8000);
					}
				
					
				}
				if(strstr(buff,str_flag[1])!=NULL && strstr(buff,"\r\n")!=NULL)
				{
				   tempstr=buff;
				   
				// Chad
					__DBG3_printf2(tempstr, dataLen);

					startchar(tempstr,',');
					tempstr = tempstr+strlen(str_flag[1])+1;//$GPGRMC,
					
					startchar(tempstr,',');
					GPS_DATA.Time.Hour = (uint8)(StrTOUINT(tempstr,2)); 
					GPS_DATA.Time.Min = (uint8)(StrTOUINT(tempstr+2,2)); 
					GPS_DATA.Time.Sec = (uint8)(StrTOUINT(tempstr+4,2)); 
					GPS_DATA.Time.ms = StrTOUINT(tempstr+7,strlen(tempstr+7)); //.sss
					tempstr = tempstr + strlen(tempstr)+1;//hhmmss.sss,
					//data flag
					GPS_DATA.Time.Flag = tempstr[0];
					tempstr = tempstr +2;
					
					GPS_DATA.Latitude.dd = (uint8)(StrTOUINT(tempstr,2)); 
					GPS_DATA.Latitude.mm = (uint8)(StrTOUINT(tempstr+2,2)); 
					GPS_DATA.Latitude.mmmm = StrTOUINT(tempstr+5,4);//.mmmm
					tempstr = tempstr + 11;//ddmm.mmmm,							<--- should 11 ublox
					//N/S Latitude
					GPS_DATA.Latitude.Indicator = tempstr[0];
					tempstr = tempstr + 2;//N,
					//Longitude
					GPS_DATA.Longitude.ddd = StrTOUINT(tempstr,3); 
					GPS_DATA.Longitude.mm = (uint8)(StrTOUINT(tempstr+3,2)); 
					GPS_DATA.Longitude.mmmm = StrTOUINT(tempstr+6,4);//.mmmm
					tempstr = tempstr + 12;//dddmm.mmmm,							<--- should 12 ublox
					//E/W Longitude
					GPS_DATA.Longitude.Indicator = tempstr[0];
					tempstr = tempstr + 2;//E
					startchar(tempstr,',');
					if(tempstr!='\0')
					{	
						ppp = tempstr + strlen(tempstr) + 1;
						if((p=strchr(tempstr,'.'))!=NULL)
							if(strlen(p)>2)
								tempstr[p-tempstr+2]='\0';
						GPS_DATA.Speed = StrTOUINT( tempstr, strlen(tempstr)-1) ;
						tempstr = ppp;//0.13,
						//Speed	
					}	
					else
					{
						GPS_DATA.Speed = 0;
						tempstr++;
					}
// Chad: Remove
//					uartWrite(UART3,(uint8	*)"+Speed=",7,NULL); 	//测试	
//					sprintf(str_flag[0],"%d+\n",GPS_DATA.Speed);
//					uartWrite(UART3,(uint8	*)str_flag[0],strlen(str_flag[0]),NULL); 	//测试
// Chad: Add
					//sprintf(gw_tempout,"\r\n+Speed=%d++\r\n",GPS_DATA.Speed);
					//uartWrite(UART3,(uint8	*)gw_tempout,strlen(gw_tempout),NULL); 	//测试

					startchar(tempstr,',');
					if(tempstr!='\0')
					{
						ppp = tempstr + strlen(tempstr) + 1;
						if((p=strchr(tempstr,'.'))!=NULL)
							tempstr[p-tempstr]='\0';
						GPS_DATA.Direction.ddd =  StrTOUINT(tempstr,strlen(tempstr));
						tempstr = tempstr + strlen(tempstr) + 1;
						if(tempstr!='\0')
						{	
					 		GPS_DATA.Direction.m =  (uint8)StrTOUINT(tempstr,strlen(tempstr));	
							tempstr = tempstr + strlen(tempstr) + 1;//306.62,
						}	
						tempstr = ppp;
	                			//Direction
	                		}
	                		else
	                		{
	                			GPS_DATA.Direction.ddd = 0;
	                			GPS_DATA.Direction.m = 0;
	                			tempstr++;
	                		}
// Chad: Remove
//	                		uartWrite(UART3,(uint8	*)"+Direction=",7,NULL); 	//测试	
//					sprintf(str_flag[0],"%d.%d+\n",GPS_DATA.Direction.ddd,GPS_DATA.Direction.m);
//					uartWrite(UART3,(uint8	*)str_flag[0],strlen(str_flag[0]),NULL); 	//测试
// Chad: Add
					//sprintf(gw_tempout,"\r\n+Direction=%d++\r\n",GPS_DATA.Direction.m);
					//uartWrite(UART3,(uint8	*)gw_tempout,strlen(gw_tempout),NULL); 	//测试
	                		
					GPS_DATA.Time.Day = (uint8)( StrTOUINT(tempstr, 2 ));
					tempstr = tempstr + 2;//dd;
					GPS_DATA.Time.Mon = (uint8)( StrTOUINT(tempstr, 2 ));
					tempstr = tempstr + 2;//mm;
					GPS_DATA.Time.Year = (uint8)( StrTOUINT(tempstr, 2 ));
					tempstr = tempstr + 2;//yy;
				
				}
				memset(buff,0,sizeof(buff));
				if(RTC_Init_OK!=2)	//GPS时间
				{
					RTC_InitDft();	//初始化RTC为当前时间
						
				}
				/*
				else	if(GPS_DATA.Time.Flag!='A')
				{
					RTC_DATETIME	dateTime;
					RtcTime(&dateTime);
					Reset_GPS_DATA(&dateTime);//置为系统时间
					
				}
				*/
//				OSSchedUnlock();
				
			}
			
			pp=ppp;
			
		}
		else
			break;
		
	}

		
	return	TRUE;
	
}
#endif // end of #if !defined(__AMOD_GPS_PARSER)

/*********************************************************************************************************
** Function name:			startchar
**
** Descriptions:			check the string from head to end
**
** input parameters:		* str :string pointer
**							endch :end char
** Returned value:			char * :return the string
**         
********************************************************************************************************/
char * startchar(char * str,char endch )
{
	uint16 i=0;
	char * Ptr;
	Ptr=str;
	while(str[i])
	{
		if(str[i]==endch)
		{
			str[i]=0;
			return Ptr;
		}
		i++;
		if(i>30)
			break;
	}
	return NULL;
} 
/*********************************************************************************************************
** Function name:			StrTOUINT
**
** Descriptions:			change string to 16 bits integer
**
** input parameters:		* str :string pointer
**							DBits :string length
** Returned value:			uint16 :changed result
**         
********************************************************************************************************/
uint16 StrTOUINT(char * str,uint8 DBits)
{
	uint8	i=0;
	uint16	j=0;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -