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