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

📄 gps.cpp

📁 一个简单的Windows Serial通讯的范例 可接收GPS讯号并解析
💻 CPP
📖 第 1 页 / 共 2 页
字号:
        while(*(pChar+j) != COMMA)
        {
            qualityString[k] = *(pChar+j);
            j++;
            k++;
			if (k>=2) break;
        }
        lastCommaPosition = j;
        qualityString[k] = '\0';
		sscanf((char *)qualityString, "%d", &fix);
		//printf(" Fix:%d\n", fix);
		GPSfix=fix;

		/* Get number of satelites  */
        pChar = stringRead;
        j = lastCommaPosition + 1;
        k = 0;
        while(*(pChar+j) != COMMA)
        {
            SatelitesString[k] = *(pChar+j);
            j++;
            k++;
			if (k>=9) break;
        }
        lastCommaPosition = j;
        SatelitesString[k] = '\0';
        sscanf((char *)SatelitesString, "%d", &NumberOfSatelites);
		//printf("Number of Satelites:%d\n",NumberOfSatelites);

		GPSNumberOfSatelites=NumberOfSatelites;
        CompareValueAndCallBack();
    }
}


void GPRMC(unsigned char *RMCString)
{
    unsigned char  *pChar;
    unsigned char  *stringRead;
    unsigned int   j, k;                          /* dummy variable */
    //unsigned int     i;                           /* Number of chars read per GPS message string */
    unsigned char  timeString[12];
    unsigned char  latitudeString[11];
//    unsigned char  latitudeCardinalString[3];
    unsigned char  longitudeString[12];
//    unsigned char  longitudeCardinalString[3];
//    unsigned char  StatusString[3];
    unsigned char  SpeedString[10];

    unsigned  long utcTime;              /* Coordinated Universal Time and Eastern Standard Time */
    unsigned  long utcHour, estHour;
    unsigned  long utcMinutes, estMinutes;
    unsigned  long utcSeconds, estSeconds;
    unsigned  char lastCommaPosition;

    float        latitude;
    int          latDegrees;
    float        latMinutes;

    float        longitude;
    int          longDegrees;
    float        longMinutes;

    float speed;

    stringRead=RMCString;
	/* Check if string we collected is the $GPGGA message */
    if(RMCString[3] == 'R' && RMCString[4] == 'M' && RMCString[5] == 'C')
    {

	/*
	 ** RMC - Recommended Minimum Navigation Information
	 **                                                            12
	 **        1         2 3       4 5        6 7   8   9    10  11|
	 **        |         | |       | |        | |   |   |    |   | |
	 ** $--RMC,hhmmss.ss,A,llll.ll,a,yyyyy.yy,a,x.x,x.x,xxxx,x.x,a*hh<CR><LF>
	 **
	 ** Field Number:
	 **  1) UTC Time
	 **  2) Status, V = Navigation receiver warning
	 **  3) Latitude
	 **  4) N or S
	 **  5) Longitude
	 **  6) E or W
	 **  7) Speed over ground, knots
	 **  8) Track made good, degrees true
	 **  9) Date, ddmmyy
	 ** 10) Magnetic Variation, degrees
	 ** 11) E or W
	 ** 12) Checksum
	 */

        pChar = stringRead;

		/* Get UTC time */
        j = 7;                                    /* start of time field */
        k = 0;
        while(*(pChar+j) != COMMA)
        {
            timeString[k] = *(pChar+j);
            j++;
            k++;
			if (k>=11) break;
        }
        lastCommaPosition = j;
        timeString[k] = '\0';
        sscanf((char *)timeString, "%ld", &utcTime);
        utcHour = (utcTime/10000);                /* extract Hours from long */
                                                  /* extract minutes from long */
        utcMinutes = (utcTime - (utcHour*10000))/100;
                                                  /* extract seconds from long */
        utcSeconds = utcTime - (utcHour*10000) - (utcMinutes*100);

        if(utcHour >= 4 && utcHour <= 23) estHour = utcHour - 4;
        else estHour = utcHour + 20;
        estMinutes = utcMinutes;
        estSeconds = utcSeconds;

		/* NB: %02ld formats long to print 2 chars wide, padding with 0 if necessary */
        //printf("%02ld:%02ld:%02ld UTC = %02ld:%02ld:%02ld EST\n", utcHour, utcMinutes, utcSeconds, estHour, estMinutes, estSeconds);		
		GPSutcHour=utcHour; //setup GLOBAL GPS DATA
		GPSutcMinutes=utcMinutes;
		GPSutcSeconds=utcSeconds;

		/* 2)Get STATUS: V or A */
        pChar = stringRead;
        j = lastCommaPosition + 1;
        k = 0;
        while(*(pChar+j) != COMMA)
        {
            GPSStatusString[k] = *(pChar+j);
            k++;
            j++;
			if (k>=2) break;
        }
        lastCommaPosition = j;
        GPSStatusString[k] = '\0';
        //printf("Status:%s\n",StatusString);
		
		/* Get lattitude: ddmm.mmmm */
        pChar = stringRead;
        j = lastCommaPosition + 1;
        k = 0;
        while(*(pChar+j) != COMMA)
        {
            latitudeString[k] = *(pChar+j);
            j++;
            k++;
			if (k>=10) break;
        }
        lastCommaPosition = j;
        latitudeString[k] = '\0';

        sscanf((char *)latitudeString, "%f", &latitude);
        latDegrees = (int)(latitude/100);
        latMinutes = (float)(latitude - latDegrees*100);
        //printf("\t%02d DEG\t%2.4f MIN", latDegrees, latMinutes);
		
		GPSlatDegrees=latDegrees;//setup global data
		GPSlatMinutes=latMinutes;
		/* Get lattitude Cardinal direction */
        pChar = stringRead;
        j = lastCommaPosition + 1;
        k = 0;
        while(*(pChar+j) != COMMA)
        {
            GPSlatitudeCardinalString[k] = *(pChar+j);
            j++;
            k++;
			if (k>=2) break;
        }
        lastCommaPosition = j;
        GPSlatitudeCardinalString[k] = '\0';
        //printf(" %s\n", latitudeCardinalString);

		/* Get longitude: dddmm.mmmm */
        pChar = stringRead;
        j = lastCommaPosition + 1;
        k = 0;
        while(*(pChar+j) != COMMA)
        {
            longitudeString[k] = *(pChar+j);
            j++;
            k++;
			if (k>=11) break;
        }
        lastCommaPosition = j;
        longitudeString[k] = '\0';

        sscanf((char *)longitudeString, "%f", &longitude);
        longDegrees = (int)(longitude/100);
        longMinutes = (float)(longitude - longDegrees*100);
        //printf("\t%03d DEG\t%2.4f MIN", longDegrees, longMinutes);
		
		GPSlongDegrees=longDegrees;
		GPSlongMinutes=longMinutes;
		/* Get longtitude Cardinal direction */
        pChar = stringRead;
        j = lastCommaPosition + 1;
        k = 0;
        while(*(pChar+j) != COMMA)
        {
            GPSlongitudeCardinalString[k] = *(pChar+j);
            j++;
            k++;
			if (k>=2) break;
        }
        lastCommaPosition = j;
        GPSlongitudeCardinalString[k] = '\0';
        //printf(" %s\n", longitudeCardinalString);

		/* Get speed: x.x */
        pChar = stringRead;
        j = lastCommaPosition + 1;
        k = 0;
        while(*(pChar+j) != COMMA)
        {
            SpeedString[k] = *(pChar+j);
            j++;
            k++;
			if (k>=9) break;
        }
        lastCommaPosition = j;
        SpeedString[k] = '\0';

        sscanf((char *)SpeedString, "%f", &speed);
        GPSspeed=speed;
		//printf("\t%2.4f ", speed);

        CompareValueAndCallBack();
    }
}

void GPSParse(unsigned char *GPSString)
{
	
	memset(cGPSString,'0',100);
	strcpy((char *)cGPSString,(char *)GPSString);
	if (GPSCallBack[GPSStringComplete]!=NULL)//GPS string callback
		GPSCallBack[GPSStringComplete]();

	if(GPSString[3] == 'R' && GPSString[4] == 'M' && GPSString[5] == 'C')
    {
		GPRMC(GPSString);
	}
	else if(GPSString[3] == 'G' && GPSString[4] == 'G' && GPSString[5] == 'A')
	{
		GPGGA(GPSString);
	}
}

⌨️ 快捷键说明

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