cancel
Showing results for 
Search instead for 
Did you mean: 

GPRMC date ?

antonius
Senior

Dear Member

I tried to get date from GPRMC, but not getting any response:

code :

sscanf(str,"$GPRMC,%s,%2hhd%2hhd%2hhd,%c,%f,%c,%f,%c,%f,%c,%f,%f,%2hhd%2hhd%2hhd,%f,%c,%c,*%2s\r\n",&GPS.GPRMC.xxRMC,&GPS.GPRMC.UTC_Hour,&GPS.GPRMC.UTC_Min,&GPS.GPRMC.UTC_Sec,&GPS.GPRMC.status,&GPS.GPRMC.Latitude,&GPS.GPRMC.NS_Indicator,&GPS.GPRMC.Longitude,&GPS.GPRMC.EW_Indicator,&GPS.GPRMC.spd,&GPS.GPRMC.cog,&GPS.GPRMC.UTC_Day,&GPS.GPRMC.UTC_Month,&GPS.GPRMC.UTC_Year,&GPS.GPRMC.mv,&GPS.GPRMC.mvEW,&GPS.GPRMC.posMode,&GPS.GPRMC.CheckSum);

Am I missing something here ?

Thanks

15 REPLIES 15

$GPGGA,043139.00,3208.00593,S,11559.31050,E,1,11,0.80,33.1,M,-30.6,M,,*54

$GPGSA,A,3,11,23,31,08,32,18,22,01,03,14,17,,1.27,0.80,0.98*0D

$GPGSV,4,1,15,01,83,198,34,03,54,216,31,08,14,351,29,09,09,312,*71

$GPGSV,4,2,15,11,66,329,35,14,24,137,29,17,19,230,29,18,67,042,26*76

$GPGSV,4,3,15,19,04,214,14,22,63,174,16,23,43,309,33,31,33,102,32*78

$GPGSV,4,4,15,32,09,136,28,42,41,046,,50,41,046,*48

$GPGLL,3208.00593,S,11559.31050,E,043139.00,A,A*70

$GPRMC,043140.00,A,3208.00595,S,11559.31048,E,0.046,,030519,,,A*64

$GPVTG,,T,,M,0.046,N,0.086,K,A*2F

$GPGGA,043140.00,3208.00595,S,11559.31048,E,1,11,0.80,33.1,M,-30.6,M,,*55

$GPGSA,A,3,11,23,31,08,32,18,22,

looks like strstr can not parse the line after \r\n ....GPVTG is on the bottom...do you reckon ? thanks

I never used clib str functions for parsing such long strings.

Instead, I did the following:

- check for proper sentence type ($GPRMC) string, and proper termination (\r\n).

- count comma characters, until you reach the parameter(s) you need.

- extract (up to the next comma) and convert (e.g. sscanf()).

You also need to evaluate the fix state field, i.e. if a proper position fix occured.

the complete code, it works on GPGGA, but doesn't work with GPVTG ....I have no clue ??? anyone ?

	if( (HAL_GetTick()-GPS.LastTime>50) && (GPS.rxIndex>0))
	{
		char	*str,*str2;
		
		#if (_GPS_DEBUG==1)
		printf("%s",GPS.rxBuffer);
		#endif
		
		str=strstr((char*)GPS.rxBuffer,"$GPVTG,");
		printf(str);printf("\r\n");
		if(str!=NULL)
		 {
		
			memset(&GPS.GPVTG,0,sizeof(GPS.GPVTG));
			sscanf(str,"$GPVTG,%f,%c,%f,%c,%f,%c,%f,%c,*%2s\r\n",
			&GPS.GPVTG.cogt,&GPS.GPVTG.T,&GPS.GPVTG.cogm,&GPS.GPVTG.M,
			&GPS.GPVTG.knots,&GPS.GPVTG.N,&GPS.GPVTG.kph,&GPS.GPVTG.K,
			&GPS.GPVTG.CheckSum);
			//$GPVTG,,T,,M,0.069,N,0.128,K,A*27 = 9 field ,spd = field7
    
 
		  //printf(str);printf("\r\n");
			
      printf("======================GPVTG PARSING =================\r\n");
			printf("Speed knots             : %f N \r\n",GPS.GPVTG.knots);
			printf("Speed in km/h           : %f km/h \r\n",GPS.GPVTG.kph);
			printf("====================== D O N E !=================\r\n");
			HAL_Delay(500);
			HAL_GPIO_TogglePin(GPIOA,GPIO_PIN_5);
		}	
	
	
		
		
		str=strstr((char*)GPS.rxBuffer,"$GPGGA,");
		//str2=str;
		if(str!=NULL)
		{
			memset(&GPS.GPGGA,0,sizeof(GPS.GPGGA));
			sscanf(str,"$GPGGA,%2hhd%2hhd%2hhd.%3hd,%f,%c,%f,%c,%hhd,%hhd,%f,%f,%c,%hd,%s,*%2s\r\n",&GPS.GPGGA.UTC_Hour,&GPS.GPGGA.UTC_Min,&GPS.GPGGA.UTC_Sec,&GPS.GPGGA.UTC_MicroSec,&GPS.GPGGA.Latitude,&GPS.GPGGA.NS_Indicator,&GPS.GPGGA.Longitude,&GPS.GPGGA.EW_Indicator,&GPS.GPGGA.PositionFixIndicator,&GPS.GPGGA.SatellitesUsed,&GPS.GPGGA.HDOP,&GPS.GPGGA.MSL_Altitude,&GPS.GPGGA.MSL_Units,&GPS.GPGGA.AgeofDiffCorr,GPS.GPGGA.DiffRefStationID,GPS.GPGGA.CheckSum);
			//printf(str);printf("\r\n");
			if(GPS.GPGGA.NS_Indicator==0)
				GPS.GPGGA.NS_Indicator='-';
			if(GPS.GPGGA.EW_Indicator==0)
				GPS.GPGGA.EW_Indicator='-';
			if(GPS.GPGGA.Geoid_Units==0)
				GPS.GPGGA.Geoid_Units='-';
			if(GPS.GPGGA.MSL_Units==0)
				GPS.GPGGA.MSL_Units='-';
			GPS.GPGGA.LatitudeDecimal=convertDegMinToDecDeg(GPS.GPGGA.Latitude);
			GPS.GPGGA.LongitudeDecimal=convertDegMinToDecDeg(GPS.GPGGA.Longitude);	
			perth_hour = GPS.GPGGA.UTC_Hour + 8;
      printf("======================B E G I N =================\r\n");
			printf("NEO 6M GPS MODULE INIT....\r\n");
			printf("UTC TIME   %u ",GPS.GPGGA.UTC_Hour);
			printf(": %u :",GPS.GPGGA.UTC_Min);
			printf(" %u \r\n",GPS.GPGGA.UTC_Sec);
			printf("Perth TIME %u ",perth_hour);
			printf(": %u :",GPS.GPGGA.UTC_Min);
			printf(" %u \r\n",GPS.GPGGA.UTC_Sec);
			printf("Altitude: %lf m\r\n",GPS.GPGGA.MSL_Altitude);
		  printf("Latitude is %lf \r\n",GPS.GPGGA.LatitudeDecimal);	
      printf("North South Indicator, (S)South (N)North is %c",GPS.GPGGA.NS_Indicator);
			printf("\r\n");
			printf("Longitude is %lf ",GPS.GPGGA.LongitudeDecimal);		
      printf("\r\n");	
			printf("West East Indicator,    (W)West (E)East  is %c \r\n",GPS.GPGGA.EW_Indicator);
			printf("Satellites Used              :        %d \r\n",GPS.GPGGA.SatellitesUsed);   
			printf("===================================================\r\n");
      			
			
			
		 			//test_card();
		}		

antonius
Senior

I got from printf on line 10

$GPVTG,,T,,M,0.074,N,0.138,K,A*2A
                                             
$GPGGA,070050.00,3208.00548,S,11559.30824,E,1,10,0.82,36.0,M,-30.6,M,,*51
     
$GPGSA,A,3,23,26,06,09,22,01,03,16,19,07,,,1.52,0.82,1.28*05
                  
$GPGSV,5,1,17,01,21,009,23,02,01,214,,03,52,084,37,04,40,264,31*7B
            
$GPGSV,5,2,17,06,33,233,35,07,40,341,25,09,54,244,28,11,04,005,*79
            
$GPGSV,5,3,17,16,15,089,12,17,06,297,,19,09,273,27,22,32,066,32*76
            
$GPGSV,5,4,17,23,60,164,35,26,12,117,21,30,09,332,19,42,41,046,*7E
            
$GPGSV,5,5,17,50,41,046,*4D
                                                   
$GPGLL,3208.00548,S,11559.30824,E,070050.00,A,A*72
                            
$GPRMC,070051.00,A,3208.00541,S,11559.30818,E,0.146,,030519,,,A*61
            
$GPVTG,,T,,M,0.146,N,0.271,K,A*24
                                             
$GPGGA,070051.00,3208.00541,S,11559.30818,E,1,10,0.82,36.1,M,-30.6,M,,
   

antonius
Senior

This what I got from function ProcessNMEALine((char*)GPS.rxBuffer)

DecodeNMEA
                                                                     
$GPRMC,074341.00,A,3208.00668,S,11559.30844,E,0.029,,030519,,,A*6E
            
$GPVTG,,T,,M,0.029,N,0.055,K,A*28
                                             
$GPGGA,074341.00,3208.00668,S,11559.30844,E,1,10,0.79,32.5,M,-30.6,M,,*54
     
$GPGSA,A,3,23,02,26,06,09,22,03,16,07,30,,,1.46,0.79,1.23*07
                  
$GPGSV,4,1,15,01,03,012,,02,14,225,25,03,38,061,31,04,50,239,31*7A
            
$GPGSV,4,2,15,06,41,255,36,07,62,333,32,09,60,209,42,16,20,108,28*7A
          
$GPGSV,4,3,15,19,00,290,,22,17,053,20,23,49,137,35,26,09,134,20*7D
            
$GPGSV,4,4,15,30,27,326,37,42,41,046,,50,41,046,*4B
                           
$GPGLL,3208.00668,S,11559.30844,E,074341.00,A,A*72
                            
$GPRMC,074342.00,A,3208.00667,S,11559.30843,E,0.057,,030519,,,A*6C
            
$GPVTG,,T,,M,0.057,N,0.106,K,A*26
                                             
$GPGGA,074342.00,3208.00667,S,11559.30843,E,1,10,0.79,32.6,M,-30.6,M,,*5C
     
$GPGSA,A,3,23,02,26,06,09,22,03,16,07
                                          
Fields 13
                                                                      
#00 : $GPRMC
                                                                   
#01 : 074341.00
                                                                
#02 : A
                                                                        
#03 : 3208.00668
                                                               
#04 : S
                                                                        
#05 : 11559.30844
                                                              
#06 : E
                                                                        
#07 : 0.029
                                                                    
#08 : 
                                                                         
#09 : 030519
                                                                   
#10 : 
                                                                         
#11 : 
                                                                         
#12 : A
                                                                        
            

Hi,

scanf works for fixed length and format messages.

Depending on sentence validity or fix validity or state (A or V , 2D,3D,etc) the sentences may change length by omitting fields and change signs.

Also for different versions of NMEA output the decimal part of Latitude and Longitude can vary from 2 to 5 digits.

An option is to feed raw data to a State Machine and by byte per byte process to extract Talker, Command, Data fields, Checksum or other proprietary data. Using an atoi function can convert arithmetical fields to numbers.