📄 gps.cpp
字号:
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 + -