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

📄 gps.cpp

📁 this the code of bootstation
💻 CPP
📖 第 1 页 / 共 3 页
字号:
	{
	  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 + -