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

📄 gps_handle.c

📁 C语言源代码及相关资料
💻 C
📖 第 1 页 / 共 2 页
字号:
	if( DBits <= 5 )
	{
		do
		{
			if(str[i] != '.')
			{
				j=(str[i]-0x30)+j*10;
				DBits--;
			}
			i++;
			
		}while(DBits > 0);
	}
	return j;
}


#if defined(__AMOD_GPS_PARSER)

unsigned char gxbgps_nState;
unsigned char gxbgps_Checksum;					// Calculated NMEA sentence checksum
unsigned char gxbgps_ReceivedChecksum;			// Received NMEA sentence checksum (if exists)
unsigned short gxwgps_Index;						// Index used for command and data
unsigned char gxbgps_Command[8];	// NMEA command
unsigned char gxbgps_Data[96];		// NMEA data
unsigned char gxbgps_HasNMEAData;

unsigned char gxbgps_pField[32];
unsigned char gxbgps_GGAGPSQuality;
unsigned char gxbgps_pRMCDataValid;
unsigned char gxbgps_pConvBuff[10];

// 
unsigned char gxbgps_GPSNMEADataType;

// 
unsigned short gxwgps_NMEAIndex;						// Index used for Whole NMEA command and data
unsigned char gxbgps_NMEAData[128];		// NMEA command + data

/*
extern unsigned char gxbgps_nState;
extern unsigned char gxbgps_Checksum;					// Calculated NMEA sentence checksum
extern unsigned char gxbgps_ReceivedChecksum;			// Received NMEA sentence checksum (if exists)
extern unsigned short gxwgps_Index;						// Index used for command and data
extern unsigned char gxbgps_Command[8];	// NMEA command
extern unsigned char gxbgps_Data[96];		// NMEA data
extern unsigned char gxbgps_HasNMEAData;

extern unsigned char gxbgps_pField[32];
extern unsigned char gxbgps_GGAGPSQuality;
extern unsigned char gxbgps_pRMCDataValid;
extern unsigned char gxbgps_pConvBuff[10];

// 
extern unsigned char gxbgps_GPSNMEADataType;

// 
extern unsigned short gxwgps_NMEAIndex;						// Index used for Whole NMEA command and data
extern unsigned char gxbgps_NMEAData[128];		// NMEA command + data
*/

// Gps module
#define NP_STATE_SOM 0						// Search for start of message
#define NP_STATE_CMD 1						// Get command
#define NP_STATE_DATA 2						// Get data
#define NP_STATE_CHECKSUM_1 3			// Get first checksum character
#define NP_STATE_CHECKSUM_2 4			// get second checksum character

#define NP_MAX_CMD_LEN			8		// maximum command length (NMEA address)
#define NP_MAX_DATA_LEN			96		// maximum data length

#define MAXFIELD	32		// maximum field length

///////////////////////////////////////////////////////////////////////////////
// Name:		GetField
//
// Description:	This function will get the specified field in a NMEA string.
//
// Entry:		BYTE *pData -		Pointer to NMEA string
//				BYTE *pField -		pointer to returned field
//				int nfieldNum -		Field offset to get
//				int nMaxFieldLen -	Maximum of bytes pFiled can handle
///////////////////////////////////////////////////////////////////////////////
unsigned char gps_GetField(unsigned char *pData, 
						unsigned char *pField, 
						unsigned short nFieldNum, 
						unsigned short nMaxFieldLen )
{
	unsigned short i = 0;
	unsigned short nField = 0;	
	unsigned short i2 = 0;
		
	//
	// Validate params
	//
	if(pData == 0 || pField == 0 || nMaxFieldLen == 0)
	{
		pField[0] = '\0';
		return 0;
	}

	//
	// Go to the beginning of the selected field
	//
	i = 0;
	nField = 0;
	while(nField != nFieldNum && pData[i])
	{
		if(pData[i] == ',')
		{
			nField++;
		}

		i++;

		if(pData[i] == 0)
		{
			pField[0] = '\0';
			return 0;
		}
	}

	if(pData[i] == ',' || pData[i] == '*')
	{
		pField[0] = '\0';
		return 0;
	}

	//
	// copy field from pData to Field
	//
	i2 = 0;
	while(pData[i] != ',' && pData[i] != '*' && pData[i])
	{
		pField[i2] = pData[i];
		i2++; i++;

		//
		// check if field is too big to fit on passed parameter. If it is,
		// crop returned field to its max length.
		//
		if(i2 >= nMaxFieldLen)
		{
			i2 = nMaxFieldLen-1;
			break;
		}
	} // emd of while

	pField[i2] = '\0';

	return i2;
}

void gps_ProcessGPRMC(void)
{
	unsigned short shRtnLen=0;
	
	sprintf(gw_tempout,"\r\nRMC: (%s)\r\n", gxbgps_Data);
	__DBG3_printf1(gw_tempout);	
	//
	// Time
	//	
	if ( (shRtnLen=gps_GetField(gxbgps_Data, gxbgps_pField, 0, MAXFIELD))>0 )
	{
		if ( shRtnLen>=6 ) {
			// <hhmmss> or <hhmmss.sss>
			// Hour
			//gxbgps_pConvBuff[0] = gxbgps_pField[0];
			//gxbgps_pConvBuff[1] = gxbgps_pField[1];
			//gxbgps_pConvBuff[2] = '\0';
			//GPS_DATA.Time.Hour = (uint8) atoi(gxbgps_pConvBuff);
			GPS_DATA.Time.Hour = (uint8)(( gxbgps_pField[0] - '0' ) * 10 + ( gxbgps_pField[1] - '0' ));
			
			// minute
			//gxbgps_pConvBuff[0] = gxbgps_pField[2];
			//gxbgps_pConvBuff[1] = gxbgps_pField[3];
			//gxbgps_pConvBuff[2] = '\0';
			//GPS_DATA.Time.Min = (uint8) atoi(gxbgps_pConvBuff);
			GPS_DATA.Time.Min = (uint8)(( gxbgps_pField[2] - '0' ) * 10 + ( gxbgps_pField[3] - '0' ));
			
			// Second
			//gxbgps_pConvBuff[0] = gxbgps_pField[4];
			//gxbgps_pConvBuff[1] = gxbgps_pField[5];
			//gxbgps_pConvBuff[2] = '\0';
			//GPS_DATA.Time.Sec = (uint8) atoi(gxbgps_pConvBuff);
			GPS_DATA.Time.Sec = (uint8)(( gxbgps_pField[4] - '0' ) * 10 + ( gxbgps_pField[5] - '0' ));
			
			if ( shRtnLen>=10 ) {
				//.sss
				// minisecond
				gxbgps_pConvBuff[0] = gxbgps_pField[7];
				gxbgps_pConvBuff[1] = gxbgps_pField[8];
				gxbgps_pConvBuff[2] = gxbgps_pField[9];
				gxbgps_pConvBuff[3] = '\0';
				GPS_DATA.Time.ms = (uint8) atoi((char *)gxbgps_pConvBuff);
			} else {
				GPS_DATA.Time.ms = 0;
			} // end of if ( shRtnLen>=10 )
		} // end of if ( shRtnLen>=6 )
	}
	
	//
	// Data valid
	//
	if ( gps_GetField(gxbgps_Data, gxbgps_pField, 1, MAXFIELD) )
	{
		if ( gxbgps_pField[0] == 'A' || gxbgps_pField[0] == 'V' ) {
			gxbgps_pRMCDataValid = gxbgps_pField[0];
			GPS_DATA.Time.Flag = gxbgps_pRMCDataValid;
		}
	}
	
	//
	// Latitude
	//
	if ( (shRtnLen=gps_GetField(gxbgps_Data, gxbgps_pField, 2, MAXFIELD))>0 )
	{
		if ( shRtnLen>=9 ) {
			// <ddmm.mmmm>
			// dd
			gxbgps_pConvBuff[0] = gxbgps_pField[0];
			gxbgps_pConvBuff[1] = gxbgps_pField[1];
			gxbgps_pConvBuff[2] = '\0';
			GPS_DATA.Latitude.dd = (uint8) atoi((char *)gxbgps_pConvBuff);
			
			// mm
			gxbgps_pConvBuff[0] = gxbgps_pField[2];
			gxbgps_pConvBuff[1] = gxbgps_pField[3];
			gxbgps_pConvBuff[2] = '\0';
			GPS_DATA.Latitude.mm = (uint8) atoi((char *)gxbgps_pConvBuff);
			
			// mmmm
			gxbgps_pConvBuff[0] = gxbgps_pField[5];
			gxbgps_pConvBuff[1] = gxbgps_pField[6];
			gxbgps_pConvBuff[2] = gxbgps_pField[7];
			gxbgps_pConvBuff[3] = gxbgps_pField[8];
			gxbgps_pConvBuff[4] = '\0';
			GPS_DATA.Latitude.mmmm = (uint16) atoi((char *)gxbgps_pConvBuff);
		} // end of if ( shRtnLen>=9 )
	}
	if ( (shRtnLen=gps_GetField(gxbgps_Data, gxbgps_pField, 3, MAXFIELD))>0 )
	{
		if( (gxbgps_pField[0] == 'S') || (gxbgps_pField[0] == 'N') )
		{
			GPS_DATA.Latitude.Indicator = gxbgps_pField[0];
		}
	}

	//
	// Longitude
	//
	if ( (shRtnLen=gps_GetField(gxbgps_Data, gxbgps_pField, 4, MAXFIELD))>0 )
	{
		if ( shRtnLen>=10 ) {
			// <dddmm.mmmm>
			// dd
			gxbgps_pConvBuff[0] = gxbgps_pField[0];
			gxbgps_pConvBuff[1] = gxbgps_pField[1];
			gxbgps_pConvBuff[2] = gxbgps_pField[2];
			gxbgps_pConvBuff[3] = '\0';
			GPS_DATA.Longitude.ddd = (uint16) atoi((char *)gxbgps_pConvBuff);
			
			// mm
			gxbgps_pConvBuff[0] = gxbgps_pField[3];
			gxbgps_pConvBuff[1] = gxbgps_pField[4];
			gxbgps_pConvBuff[2] = '\0';
			GPS_DATA.Longitude.mm = (uint8) atoi((char *)gxbgps_pConvBuff);
			
			// mmmm
			gxbgps_pConvBuff[0] = gxbgps_pField[6];
			gxbgps_pConvBuff[1] = gxbgps_pField[7];
			gxbgps_pConvBuff[2] = gxbgps_pField[8];
			gxbgps_pConvBuff[3] = gxbgps_pField[9];
			gxbgps_pConvBuff[4] = '\0';
			GPS_DATA.Longitude.mmmm = (uint16) atoi((char *)gxbgps_pConvBuff);
		} // end of if ( shRtnLen>=10 )
	}
	if ( gps_GetField(gxbgps_Data, gxbgps_pField, 5, MAXFIELD) )
	{
		if( (gxbgps_pField[0] == 'W') || (gxbgps_pField[0] == 'E') )
		{
			GPS_DATA.Longitude.Indicator = gxbgps_pField[0];
		}
	}
	
	//
	// Ground speed
	//
	if ( (shRtnLen=gps_GetField(gxbgps_Data, gxbgps_pField, 6, MAXFIELD))>0 )
	{
		/*
		char *pIdx;
		if( (pIdx=strchr(gxbgps_pField,'.'))!=0 )
			//if(strlen(pIdx)>2)
			if ( (shRtnLen-pIdx-1)>2 )
				//gxbgps_pField[pIdx-gxbgps_pField+2]='\0';
				pIdx[0]='\0';
		GPS_DATA.Speed = StrTOUINT((char*)gxbgps_pField, strlen(gxbgps_pField)-1) ;
		*/
		double dAltitude = atof((char*)gxbgps_pField);
		dAltitude = dAltitude * 100;
		GPS_DATA.Speed = (uint16) dAltitude;
	}
	
	//
	// course over ground, degrees true
	//
	if ( gps_GetField(gxbgps_Data, gxbgps_pField, 7, MAXFIELD) ) {
		char *pIdx;
		if( (pIdx=strchr((char*)gxbgps_pField,'.'))!=0 )
			//gxbgps_pField[pIdx-gxbgps_pField]='\0';
			pIdx[0]='\0';
		GPS_DATA.Direction.ddd =  StrTOUINT((char*)gxbgps_pField,strlen((char*)gxbgps_pField));
		//pIdx = gxbgps_pField + strlen(gxbgps_pField) + 1;
		pIdx++;
		if( pIdx!='\0' )
		{	
			GPS_DATA.Direction.m =  (uint8)StrTOUINT(pIdx,strlen(pIdx));	
		}
	}

	//
	// Date
	//
	if ( gps_GetField(gxbgps_Data, gxbgps_pField, 8, MAXFIELD) ) {
		// Day
		//gxbgps_pConvBuff[0] = gxbgps_pField[0];
		//gxbgps_pConvBuff[1] = gxbgps_pField[1];
		//gxbgps_pConvBuff[2] = '\0';
		//GPS_DATA.Time.Day = (uint8) atoi((char *)gxbgps_pConvBuff);
		GPS_DATA.Time.Day = ( gxbgps_pField[0] - '0' ) * 10 + ( gxbgps_pField[1] - '0' );
		
		// Month
		//gxbgps_pConvBuff[0] = gxbgps_pField[2];
		//gxbgps_pConvBuff[1] = gxbgps_pField[3];
		//gxbgps_pConvBuff[2] = '\0';
		//GPS_DATA.Time.Mon = (uint8) atoi(gxbgps_pConvBuff);
		GPS_DATA.Time.Mon = ( gxbgps_pField[2] - '0' ) * 10 + ( gxbgps_pField[3] - '0' );
		
		// Year
		//gxbgps_pConvBuff[0] = gxbgps_pField[4];
		//gxbgps_pConvBuff[1] = gxbgps_pField[5];
		//gxbgps_pConvBuff[2] = '\0';
		//GPS_DATA.Time.Year = (uint8) atoi(gxbgps_pConvBuff);		
		GPS_DATA.Time.Year = ( gxbgps_pField[4] - '0' ) * 10 + ( gxbgps_pField[5] - '0' );
	}
	
	// Set RTC Time
	if(RTC_Init_OK!=2 )	//GPS

⌨️ 快捷键说明

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