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

📄 gps.cpp

📁 一个简单的Windows Serial通讯的范例 可接收GPS讯号并解析
💻 CPP
📖 第 1 页 / 共 2 页
字号:
#include "stdafx.h"
#include "Serial.h"

/* Some helpful defines */
#define SPACE     0x20
#define COMMA     0x2C
#define MAXSIZE    100                            /* GPS at most, sends 80 or so chars per message string.  So set maximum to 100 */

FireEvent (GPSCallBack)[MAX_HANDLER];

//GPS dll export data(GPRMC)
SERIAL_API int              GPSlatDegrees;
SERIAL_API float            GPSlatMinutes;
SERIAL_API unsigned char    GPSlatitudeCardinalString[3];
SERIAL_API int              GPSlongDegrees;
SERIAL_API float            GPSlongMinutes;
SERIAL_API unsigned char    GPSlongitudeCardinalString[3];
SERIAL_API unsigned  long   GPSutcHour;
SERIAL_API unsigned  long   GPSutcMinutes;
SERIAL_API unsigned  long   GPSutcSeconds; 
SERIAL_API float            GPSspeed;
SERIAL_API unsigned char    GPSStatusString[3];
//GPS dll export data(GPGGA)
SERIAL_API int              GPSfix;
SERIAL_API int              GPSNumberOfSatelites;
//GPSString
SERIAL_API unsigned char cGPSString[100];

//stored data

//GPS dll export data(GPRMC)
int              oGPSlatDegrees=0;
float            oGPSlatMinutes=0;
unsigned char    oGPSlatitudeCardinalString[3]="z";
int              oGPSlongDegrees=0;
float            oGPSlongMinutes=0;
unsigned char    oGPSlongitudeCardinalString[3]="z";
unsigned  long   oGPSutcHour=0;
unsigned  long   oGPSutcMinutes=0;
unsigned  long   oGPSutcSeconds=0; 
float            oGPSspeed=0;
unsigned char    oGPSStatusString[3]="z";
//GPS dll export data(GPGGA)
int              oGPSfix=0;
int              oGPSNumberOfSatelites=0;

//for .net


SERIAL_API void RegGPSCallBack(int HookNumber,FireEvent regfunc)
{
	GPSCallBack[HookNumber]=regfunc;
}
void CompareValueAndCallBack()
{
	

	if (oGPSlatDegrees!=GPSlatDegrees ||
		oGPSlatMinutes!=GPSlatMinutes ||
		strcmp((char *)oGPSlatitudeCardinalString,(char *)GPSlatitudeCardinalString)!=0 ||
		oGPSlongDegrees!=GPSlongDegrees ||
		oGPSlongMinutes!=GPSlongMinutes ||
		strcmp((char *)oGPSlongitudeCardinalString,(char *)GPSlongitudeCardinalString)!=0 ||
		oGPSutcHour!=GPSutcHour ||
		oGPSutcMinutes!=GPSutcMinutes ||
		oGPSutcSeconds!=GPSutcSeconds ||
		oGPSspeed!=GPSspeed ||
		strcmp((char *)oGPSStatusString,(char *)GPSStatusString)!=0 ||
		oGPSfix!=GPSfix ||
		oGPSNumberOfSatelites!=GPSNumberOfSatelites)
	{
		oGPSlatDegrees=GPSlatDegrees;
		oGPSlatMinutes=GPSlatMinutes;
		strncpy((char *)oGPSlatitudeCardinalString,(char *)GPSlatitudeCardinalString,3);
		oGPSlongDegrees=GPSlongDegrees;
		oGPSlongMinutes=GPSlongMinutes;
		strncpy((char *)oGPSlongitudeCardinalString,(char *)GPSlongitudeCardinalString,3);
		oGPSutcHour=GPSutcHour;
		oGPSutcMinutes=GPSutcMinutes;
		oGPSutcSeconds=GPSutcSeconds;
		oGPSspeed=GPSspeed;
		strncpy((char *)oGPSStatusString,(char *)GPSStatusString,3);
		oGPSfix=GPSfix;
		oGPSNumberOfSatelites=GPSNumberOfSatelites;
				
		if (GPSCallBack[GPSDataChange]!=NULL)
			GPSCallBack[GPSDataChange]();
		
	}
}
void GPGGA(unsigned char *GGAString)
{
    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  qualityString[3];
	unsigned char  SatelitesString[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;

	int          fix;
	int          NumberOfSatelites;

    stringRead=GGAString;
	/* Check if string we collected is the $GPGGA message */
    if(GGAString[3] == 'G' && GGAString[4] == 'G' && GGAString[5] == 'A')
    {
	/*
	Found GPGGA string.  It has 14 commas total.  Its NMEA sentence structure is:

	$GPGAA,hhmmss.ss,ddmm.mmmm,n,dddmm.mmmm,e,q,ss,y.y,a.a,z,g.g,z,t.t,iii*CC<CR><LF>
	|    |    |    |    |    |    |    |    |    |    |    |    |    |    |
	0   	   1         2         3         4         5         6         7
	0123456789012345678901234567890123456789012345678901234567890123456789012

	where:

	GPGAA		: GPS fixed data identifier
	hhmmss.ss	: Coordinated Universal Time (UTC), also known as GMT
	ddmm.mmmm,n	: Latitude in degrees, minutes and cardinal sign
	dddmm.mmmm,e	: Longitude in degrees, minutes and cardinal sign
	q		: Quality of fix.  1 = there is a fix
	ss		: Number of satellites being used
	y.y		: Horizontal dilution of precision
	a.a,M		: GPS antenna altitude in meters
	g.g,M		: geoidal separation in meters
	t.t		: Age of the defferential correction data
	iiii		: Deferential station's ID
	*CC		: checksum for the sentence
	*/

        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);
		

		/* 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);

		/* Get lattitude Cardinal direction */
        pChar = stringRead;
        j = lastCommaPosition + 1;
        k = 0;
        while(*(pChar+j) != COMMA)
        {
            latitudeCardinalString[k] = *(pChar+j);
            j++;
            k++;
			if (k>=2) break;
        }
        lastCommaPosition = j;
        latitudeCardinalString[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);

		/* Get longtitude Cardinal direction */
        pChar = stringRead;
        j = lastCommaPosition + 1;
        k = 0;
        while(*(pChar+j) != COMMA)
        {
            longitudeCardinalString[k] = *(pChar+j);
            j++;
            k++;
			if (k>=2) break;
        }
        lastCommaPosition = j;
        longitudeCardinalString[k] = '\0';
        //printf(" %s\n", longitudeCardinalString);
		
		/* Get quality */
        pChar = stringRead;
        j = lastCommaPosition + 1;
        k = 0;

⌨️ 快捷键说明

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