📄 gps.cpp
字号:
{
if ( bDebugInfo == TRUE ) printf("****** Funktion: CSerial::SendData: Invalid Handler! ******\n");
return (0);
}
DWORD dwBytesWritten = 0; // Variable zum Speichern der Anzahl der gesendeten Zeichen/Bytes
WriteFile(hComm, buffer, iBytesToWrite, &dwBytesWritten, NULL); // Schreiben des Buffers auf den Com-Port
return ((int) dwBytesWritten); // Zurueckgeben der Anzahl der geschriebenen Zeichen/Bytes
}
//------------------------------------------------------------------------------------------------------------------------
// Funktion: SetDebug ( Boolean bDebug );
// Beschreibung: Setzen des Flags mit oder ohne Debug-Informationen
// Paramter: Boolean bDebug : True : Mit debug-Informationen
// False: Ohne Debug-Informationen
// Return: -
//------------------------------------------------------------------------------------------------------------------------
CSerial::SetDebug ( BOOL bDebug )
{
bDebugInfo = bDebug; // Setzen des Flags DebugInfo
if ( bDebugInfo == TRUE ) printf("********** DEBUG-INFORMATION ACTIVATED **********\n");
}
//------------------------------------------------------------------------------------------------------------------------
// Funktion: Bool IsMsgGood ( const char* buffer );
// Beschreibung: Ist die empfangene Nachricht korrekt
// Paramter: const char* buffer: Zeiger auf das Array mit der empfangenen Nachricht
// Return: BOOL : True: Nachricht ist Korrekt
// : False: Nachricht ist nicht korrekt
//------------------------------------------------------------------------------------------------------------------------
CSerial::IsMsgGood ( const char* buffer )
{
if ( bDebugInfo == TRUE ) printf("****** Funktion: CSerial::IsMsgGood ******\n");
// Laenge des eingelesendes Buffers ist immer 82 Zeichen lang, da ein NMEA Nachricht nie laenger ist als 82 Bytes
// Kontrolle ob die Zeichenkette die richtige Laenge hat
int iLength = strlen ( buffer );
if ( iLength >= 83 )
{
if ( bDebugInfo == TRUE ) printf("****** Funktion: CSerial::IsMsgGood Msg zulang: %i ******\n",iLength);
return (FALSE);
}
// BOOL Variable zum testen ob CR gefunden wurde
BOOL bTest = FALSE;
// suchen nach ende der Msg
for ( int i = 0; i < iLength; i++ )
{
if ( buffer[i] == '*' )
{
// FLAG setzen * gefunden
bTest = TRUE;
// ist es nicht das letzte Zeichen
if ( i != iLength-1 )
{
if ( ( buffer[i+1] != ' ' ) && ( buffer[i+2] != ' ' ) )
{
// Ende gefunden
break;
}
else
{
if ( bDebugInfo == TRUE ) printf("****** Funktion: CSerial::IsMsgGood No CheckSum found ******\n");
return (FALSE);
}
}
else
{
if ( bDebugInfo == TRUE ) printf("****** Funktion: CSerial::IsMsgGood No end found ******\n");
return (FALSE);
}
}
}
// wurde ueberhaupt das CR gefunden wenn nicht...
if ( !bTest )
{
if ( bDebugInfo == TRUE ) printf("****** Funktion: CSerial::IsMsgGood No CR found ******\n");
return (FALSE);
}
if ( iLength >= 6 )
{
// Pruefen ob eins der unterstuetzen Protokolle in der Nachricht ist
// Unterstuetze Protokolle: GGA, GSA, GSV, RMC, GLL, VTG
// Aufbau einer NMEA Nachricht: $GPXXX wobei XXX das Protokoll beinhaltet
if ( !( ( buffer[0] == '$' ) && ( buffer[1] == 'G' ) && ( buffer[2] == 'P' ) &&
( ( ( buffer[3] == 'G' ) && ( buffer[4] == 'G' ) && ( buffer[5] == 'A' ) ) ||
( ( buffer[3] == 'G' ) && ( buffer[4] == 'S' ) && ( buffer[5] == 'A' ) ) ||
( ( buffer[3] == 'G' ) && ( buffer[4] == 'S' ) && ( buffer[5] == 'V' ) ) ||
( ( buffer[3] == 'R' ) && ( buffer[4] == 'M' ) && ( buffer[5] == 'C' ) ) ||
( ( buffer[3] == 'G' ) && ( buffer[4] == 'L' ) && ( buffer[5] == 'L' ) ) ||
( ( buffer[3] == 'V' ) && ( buffer[4] == 'T' ) && ( buffer[5] == 'G' ) ) ) ) )
{
if ( bDebugInfo == TRUE ) printf("****** Funktion: CSerial::IsMsgGood Kein Protokoll gefunden! ******\n");
return ( FALSE );
}
}
// die Laenge der Nachricht ist zu klein
else
{
if ( bDebugInfo == TRUE ) printf("****** Funktion: CSerial::IsMsgGood under min length: %i ******\n", iLength);
return ( FALSE );
}
return ( TRUE );
}
//------------------------------------------------------------------------------------------------------------------------
// Funktion: Bool CheckMsg ( const char* buffer );
// Beschreibung: Ist die empfangene Msg &Checksum korrekt
// Paramter: const char* buffer: Zeiger auf das Array mit der empfangenen Nachricht
// Return: BOOL : True: CheckSum ist Korrekt
// : False: CheckSum ist nicht korrekt
//------------------------------------------------------------------------------------------------------------------------
CSerial::CheckMsg ( const char* buffer )
{
if ( bDebugInfo == TRUE ) printf("****** Funktion: CSerial::CheckMsg ******\n");
if ( !IsMsgGood(buffer) )
{
if ( bDebugInfo == TRUE ) printf("****** Funktion: CSerial::CheckMsg Msg nicht korrekt! ******\n");
return ( FALSE );
}
int iCheckSum = 0; // errechnete Checksum
int iTransCheckSum = 0; // uebermittelte CheckSum
// Die Message wurde geprueft und ist somit 82 oder mehr Zeichen lang!
for ( int i = 1; i< 83; i++)
{
if ( buffer[i] != '*' )
{
if ( iCheckSum == 0 ) // erstes Zeichen dnn wird nur addiert!
{
iCheckSum = buffer[i];
}
else
{
iCheckSum ^= buffer[i]; // XOR Verknuepfung aller Zeichern zwischen $ und *
}
}
if ( buffer[i] =='*' ) // Ende der Pruefsumme wude erreicht
{
break;
}
}
// Wenn das '*' gefunden wurde ...wurde die For Schleife abgebrochen und somit zeigt buffer[i] immer noch auf das Zeichen!
if ( buffer[i] != '*' )
{
if ( bDebugInfo == TRUE ) printf("****** Funktion: CSerial::CheckMsg Ende nicht gefunden! ******\n");
return ( FALSE );
}
else
{
// das Ende wurde gefunden ...i zeigt immer noch auf '*' ..die Checksum ist eine zweistellige Hexzahl nach dem '*'
switch( buffer[i+2] ) // Bestimmen des Wertes der Checksum 1 Zeichen (Y) 0xXY
{
case '0' : iTransCheckSum = buffer[i+2] - 48; break;
case '1' : iTransCheckSum = buffer[i+2] - 48; break;
case '2' : iTransCheckSum = buffer[i+2] - 48; break;
case '3' : iTransCheckSum = buffer[i+2] - 48; break;
case '4' : iTransCheckSum = buffer[i+2] - 48; break;
case '5' : iTransCheckSum = buffer[i+2] - 48; break;
case '6' : iTransCheckSum = buffer[i+2] - 48; break;
case '7' : iTransCheckSum = buffer[i+2] - 48; break;
case '8' : iTransCheckSum = buffer[i+2] - 48; break;
case '9' : iTransCheckSum = buffer[i+2] - 48; break;
case 'A' : iTransCheckSum = 10; break;
case 'B' : iTransCheckSum = 11; break;
case 'C' : iTransCheckSum = 12; break;
case 'D' : iTransCheckSum = 13; break;
case 'E' : iTransCheckSum = 14; break;
case 'F' : iTransCheckSum = 15; break;
default : {
if ( bDebugInfo == TRUE ) printf("****** Funktion: CSerial::CheckMsg Zweite Stelle keine Hex. Zahl!: %c ******\n",buffer[i+2]);
return ( FALSE);
}
}
switch( buffer[i+1] ) // Bestimmen des Wertes der Checksum 1 Zeichen (X) 0xXY
{
case '0' : iTransCheckSum = iTransCheckSum + ( buffer[i+1] - 48 ) * 16; break;
case '1' : iTransCheckSum = iTransCheckSum + ( buffer[i+1] - 48 ) * 16; break;
case '2' : iTransCheckSum = iTransCheckSum + ( buffer[i+1] - 48 ) * 16; break;
case '3' : iTransCheckSum = iTransCheckSum + ( buffer[i+1] - 48 ) * 16; break;
case '4' : iTransCheckSum = iTransCheckSum + ( buffer[i+1] - 48 ) * 16; break;
case '5' : iTransCheckSum = iTransCheckSum + ( buffer[i+1] - 48 ) * 16; break;
case '6' : iTransCheckSum = iTransCheckSum + ( buffer[i+1] - 48 ) * 16; break;
case '7' : iTransCheckSum = iTransCheckSum + ( buffer[i+1] - 48 ) * 16; break;
case '8' : iTransCheckSum = iTransCheckSum + ( buffer[i+1] - 48 ) * 16; break;
case '9' : iTransCheckSum = iTransCheckSum + ( buffer[i+1] - 48 ) * 16; break;
case 'A' : iTransCheckSum = iTransCheckSum + 10 * 16; break;
case 'B' : iTransCheckSum = iTransCheckSum + 11 * 16; break;
case 'C' : iTransCheckSum = iTransCheckSum + 12 * 16; break;
case 'D' : iTransCheckSum = iTransCheckSum + 13 * 16; break;
case 'E' : iTransCheckSum = iTransCheckSum + 14 * 16; break;
case 'F' : iTransCheckSum = iTransCheckSum + 15 * 16; break;
default : {
if ( bDebugInfo == TRUE ) printf("****** Funktion: CSerial::CheckMsg Erste Stelle keine Hex. Zahl!: %c ******\n",buffer[i+1]);
return ( FALSE);
}
}
}
if ( iTransCheckSum != iCheckSum )
{
if ( bDebugInfo == TRUE ) printf("****** Funktion: CSerial::CheckMsg nicht gleich! Calc: %i - Trans: %i ******\n",iCheckSum,iTransCheckSum);
return ( FALSE );
}
return (TRUE);
}
//------------------------------------------------------------------------------------------------------------------------
// Funktion: PrintRaw ( const char* buffer );
// Beschreibung: Empfangenen Daten ausgeben
// Paramter: const char* buffer: Zeiger auf das Array mit der empfangenen Nachricht
// Return: -
//-------------------------------------------------------------------------------------------------------------------
CSerial::PrintRaw ( const char* buffer )
{
if ( bDebugInfo == TRUE ) printf("****** Funktion: CSerial::PrintRaw ******\n");
printf ( "Nachricht: %s \n",buffer); // Einfaches ausgeben der empfangenen Daten
}
//------------------------------------------------------------------------------------------------------------------------
// Funktion: BOOL PrintOverview ( const char* buffer );
// Beschreibung: Empfangenen Daten ausgeben
// Paramter: const char* buffer: Zeiger auf das Array mit der empfangenen Nachricht
// Return: BOOL : True: Ausgeben war erfolgreich
// : False: Ausgeben war nicht erfolgreich
//-------------------------------------------------------------------------------------------------------------------
CSerial::PrintOverview ( const char* buffer )
{
if(!RMC_flag)
{
return (0);
}//if(!RMC_flag)
else//if(!RMC_flag)
{
if ( !CheckMsg(buffer) ) // Testen ob die empfangenen MSg und Checkum korrekt sind
{
if ( bDebugInfo != TRUE ) //printf("****** Funktion: CSerial::CheckMsg failed ******\n");
return ( FALSE );
}
// wenn hier dann ist die Msg korrekt
char MsgTyp[3];
// Auslesen der Tys der Nachricht..z.B. GGA,GSA,GSV usw da Msg vorher geprueft dann diese direkt ausgelesen werden
// Aufbau einer Nachricht $GPXXX
MsgTyp[0] = buffer[3];
MsgTyp[1] = buffer[4];
MsgTyp[2] = buffer[5];
MsgTyp[3] = '\0';
BOOL bTest = FALSE;
//printf( "%s \n" ,MsgTyp );
// ---------------------------------------------------------------
// ------------ Ist der Typ RMC
// ---------------------------------------------------------------
if ( ! strcmp( MsgTyp, "RMC" ) && ( bTest == FALSE ) )
{
int iCount = 0;
int iPlace = 0;
for ( int i = 7; i < 83; i ++ ) // Bei Stelle 7 start da vorhe Ident der Nachricht und Komma: $GPXXX,
{
if ( buffer[i] == '*' )
{
break;
}
if ( buffer[i] == ',' )
{
switch ( iCount )
{
case 0:
{
if ( iPlace != 0 )
{
//printf ( " UTC Time (Format: hhmmss.sss): " );
while ( iPlace != 0 )
{
//printf ( "%c",buffer[i-iPlace] );
iPlace--;
}
//printf ("\n");
}
else
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -