| 
	
	|  |  |  
	
		| View previous topic :: View next topic |  
		| Author | Message |  
		| PICoHolic 
 
 
 Joined: 04 Jan 2005
 Posts: 224
 
 
 
			    
 
 | 
			
				| GPRMC GPS message decode |  
				|  Posted: Tue Jul 12, 2011 5:44 am |   |  
				| 
 |  
				|  	  | Code: |  	  | ///////////////////////////////////////////////////////////////////////////////
 #include <string.h>
 #include <stdlib.h>
 ///////////////////////////////////////////////////////////////////////////////
 typedef struct _DateTimeInfo
 {
 int8 Day;
 int8 Month;
 int8 Year;
 int8 Hour;
 int8 Minute;
 int8 Second;
 } DateTimeInfo;
 ////////////////////////////////////////
 typedef struct _GPRMCInfo
 {
 char Valid;
 DateTimeInfo DT;
 float Latitude;
 char N_S;
 float Longitude;
 char E_W;
 float Speed;
 } GPRMCInfo;
 ///////////////////////////////////////////////////////////////////////////////
 //copy string (pos n to pos m) from s2 to s1
 char* StrnmCpy(char *s1, char *s2, size_t n, size_t m)
 {
 int8 i;
 char *s;
 
 for (s=s1, i=n, s2+=n; i<=m; i++)
 *s++ = *s2++;
 *s = '\0';
 
 return s1;
 }
 ///////////////////////////////////////////////////////////////////////////////
 // find c in s starting from pos st
 int8 StrFnd(char *s, char c, size_t st)
 {
 int8 l;
 
 for (l=st, s+=st ; *s != '\0' ; l++, s++)
 if (*s == c)
 return l;
 return -1;
 }
 ///////////////////////////////////////////////////////////////////////////////
 void GPRMC_decode(char *GPRMCStr, GPRMCInfo *RMCInfo)
 {
 int8 p1, p2;
 char TempStr[16];
 
 p1 = StrFnd(GPRMCStr, ',', 0);      //find first comma
 if (p1 == 6)
 {
 //check for valid packet:
 if ( (StrFnd(GPRMCStr, 'A', p1+1) == 18) && (GPRMCStr[0]=='$')) //valid?
 {
 RMCInfo->Valid = 'A';
 
 //Get time
 p1 = StrFnd(GPRMCStr, ',', 0);      //find first comma
 p2 = StrFnd(GPRMCStr, ',', p1+1);   //find next comma
 RMCInfo->DT.Hour = atoi(StrnmCpy(TempStr, GPRMCStr, p1+1, p1+2));   //hour
 RMCInfo->DT.Minute = atoi(StrnmCpy(TempStr, GPRMCStr, p1+3, p1+4)); //min
 RMCInfo->DT.Second = atoi(StrnmCpy(TempStr, GPRMCStr, p1+5, p1+6)); //sec
 
 //Get latitude & direction
 p1 = StrFnd(GPRMCStr, ',', p2+1);   //find next comma
 p2 = StrFnd(GPRMCStr, ',', p1+1);   //find next comma
 RMCInfo->Latitude = atof(StrnmCpy(TempStr, GPRMCStr, p1+1, p2-1));
 RMCInfo->N_S = GPRMCStr[p2+1];
 
 //Get longitude & direction
 p1 = StrFnd(GPRMCStr, ',', p2+1);   //find next comma
 p2 = StrFnd(GPRMCStr, ',', p1+1);   //find next comma
 RMCInfo->Longitude = atof(StrnmCpy(TempStr, GPRMCStr, p1+1, p2-1));
 RMCInfo->E_W = GPRMCStr[p2+1];
 
 //Get speed
 p1 = StrFnd(GPRMCStr, ',', p2+1);   //find next comma
 p2 = StrFnd(GPRMCStr, ',', p1+1);   //find next comma
 RMCInfo->Speed = atof(StrnmCpy(TempStr, GPRMCStr, p1+1, p2-1));
 
 //Get date
 p1 = StrFnd(GPRMCStr, ',', p2+1);   //find next comma
 p2 = StrFnd(GPRMCStr, ',', p1+1);   //find next comma
 RMCInfo->DT.Day = atoi(StrnmCpy(TempStr, GPRMCStr, p1+1, p1+2));  //dd
 RMCInfo->DT.Month = atoi(StrnmCpy(TempStr, GPRMCStr, p1+3, p1+4));//mm
 RMCInfo->DT.year = atoi(StrnmCpy(TempStr, GPRMCStr, p1+5, p1+6)); //yy
 }
 else                                //not valid
 {
 RMCInfo->Valid = 'V';
 }
 }
 }
 ///////////////////////////////////////////////////////////////////////////////
 
 | 
 |  |  
		|  |  
		| drx2k 
 
 
 Joined: 31 Mar 2010
 Posts: 10
 
 
 
			    
 
 | 
			
				| example |  
				|  Posted: Sun Jun 03, 2012 11:59 pm |   |  
				| 
 |  
				| how to use this code? |  |  
		|  |  
		| PICoHolic 
 
 
 Joined: 04 Jan 2005
 Posts: 224
 
 
 
			    
 
 | 
			
				| Usage |  
				|  Posted: Thu Aug 02, 2012 5:27 am |   |  
				| 
 |  
				| Interrupt routine for UART: 
 
  	  | Code: |  	  | char GPSData[128];
 unsigned int8 GPSDataPtr=0;
 char c;
 int8 GPSDataReady = FALSE;
 int8 GPSmsgCount = 0;
 
 #INT_RDA
 void RDA_isr(void)
 {
 c = getc();
 switch (c)
 {
 case '$':
 GPSDataPtr = 0;
 break;
 
 case '\n':
 GPSDataReady = TRUE;
 break;
 }
 
 GPSData[GPSDataPtr++ & 0x7F] = c;
 
 }
 
 | 
 
 Somewhere in main():
 
  	  | Code: |  	  | if (GPSDataReady)
 {
 GPRMC_decode(GPSData, &MyGPRMCInfo);
 if (MyGPRMCInfo.Valid == 'A')
 {
 #ifdef DEBUG_MODE
 printf("\n\rTime: %d:%d:%d\n\r", MyGPRMCInfo.DT.Hour, MyGPRMCInfo.DT.Minute, MyGPRMCInfo.DT.Second);
 printf("Date: %d/%d/%d\n\r", MyGPRMCInfo.DT.Day, MyGPRMCInfo.DT.Month, MyGPRMCInfo.DT.Year);
 printf("Latitude: %f %c\n\r", MyGPRMCInfo.Latitude, MyGPRMCInfo.N_S);
 printf("Longitude: %f %c\n\r", MyGPRMCInfo.Longitude, MyGPRMCInfo.E_W);
 printf("Speed: %f knots\n\r", MyGPRMCInfo.Speed);
 printf("Data saved!\n\r");
 #endif
 }
 GPSDataReady = FALSE;
 }
 
 | 
 |  |  
		|  |  
		| lan ahmad 
 
 
 Joined: 23 Jul 2012
 Posts: 13
 
 
 
			    
 
 | 
			
				|  |  
				|  Posted: Sun Oct 07, 2012 11:23 am |   |  
				| 
 |  
				| Undefined Indentifier MyGPRMCInfo? 
 what is MyGPRMCInfo?
 |  |  
		|  |  
		| PICoHolic 
 
 
 Joined: 04 Jan 2005
 Posts: 224
 
 
 
			    
 
 | 
			
				|  |  
				|  Posted: Sun Oct 07, 2012 12:55 pm |   |  
				| 
 |  
				| It's a variable of type GPRMCInfo (the structure above) 
  	  | Code: |  	  | GPRMCInfo MyGPRMCInfo; | 
 |  |  
		|  |  
		| lan ahmad 
 
 
 Joined: 23 Jul 2012
 Posts: 13
 
 
 
			    
 
 | 
			
				|  |  
				|  Posted: Fri Dec 14, 2012 10:58 am |   |  
				| 
 |  
				|  	  | PICoHolic wrote: |  	  | It's a variable of type GPRMCInfo (the structure above) 
  	  | Code: |  	  | GPRMCInfo MyGPRMCInfo; | 
 | 
 
 how i can define it?where?
 |  |  
		|  |  
		| PICoHolic 
 
 
 Joined: 04 Jan 2005
 Posts: 224
 
 
 
			    
 
 | 
			
				|  |  
				|  Posted: Sat Dec 15, 2012 3:37 am |   |  
				| 
 |  
				| It's already defined above!! 
 Just declare it before you use it!
 |  |  
		|  |  
		| Jhonny 
 
 
 Joined: 30 Jan 2011
 Posts: 16
 
 
 
			    
 
 | 
			
				|  |  
				|  Posted: Sun Feb 09, 2014 8:01 am |   |  
				| 
 |  
				|  	  | PICoHolic wrote: |  	  | It's already defined above!! Just declare it before you use it!
 | 
 
 Dear Picoholic! Please describe for me exactly where and how to declare this "MyGPRMCInfo." The source would be great, but unfortunately, the compiler writes error:
 "Undefined identifier MyGPRMCInfo" - Because of this, unfortunately can not use the code. (Please understand, I'm a beginner!) Thank you very much for your help!
  |  |  
		|  |  
		| PICoHolic 
 
 
 Joined: 04 Jan 2005
 Posts: 224
 
 
 
			    
 
 | 
			
				|  |  
				|  Posted: Sun Feb 09, 2014 12:52 pm |   |  
				| 
 |  
				| I have already answered that. Scroll up. 
  	  | Code: |  	  | GPRMCInfo MyGPRMCInfo;
 
 | 
 |  |  
		|  |  
		| PCM programmer 
 
 
 Joined: 06 Sep 2003
 Posts: 21708
 
 
 
			    
 
 | 
			
				|  |  
				|  Posted: Sun Feb 09, 2014 1:31 pm |   |  
				| 
 |  
				| He wants to know where to put the declaration.  Since the demonstration code above is said to be "somewhere in main", then he can put the
 declaration at the start of main().  That's all he wants to know.
 
  	  | Code: |  	  | void main() {
 GPRMCInfo MyGPRMCInfo;
 
 .
 .
 .
 
 
 }
 
 | 
 |  |  
		|  |  
		| Jhonny 
 
 
 Joined: 30 Jan 2011
 Posts: 16
 
 
 
			    
 
 | 
			
				|  |  
				|  Posted: Mon Feb 10, 2014 7:55 am |   |  
				| 
 |  
				| Dear PCM programmer! That's right, you say! That's exactly what I wanted. Thank you very much for your help and for PICoHolic!  |  |  
		|  |  
		| PICoHolic 
 
 
 Joined: 04 Jan 2005
 Posts: 224
 
 
 
			    
 
 | 
			
				|  |  
				|  Posted: Mon Feb 10, 2014 9:09 am |   |  
				| 
 |  
				| Dear Jhonny, glad it works. 
 PS: in order to write a program in C for a microcontroller, a minimum knowledge in C language is required. Declaring a variable before using it is an extremely basic thing to know. Am I mistaken?
 
 After all CCS forum is not a C language forum, it's a microcontroller programming forum using CCS C compiler. C language should be a prerequisite.
 
 Cheers!
 |  |  
		|  |  
		| JAM2014 
 
 
 Joined: 24 Apr 2014
 Posts: 140
 
 
 
			    
 
 | 
			
				|  |  
				|  Posted: Fri Jun 08, 2018 10:40 am |   |  
				| 
 |  
				| Hi All, 
 Here is a modified version of PICoHolic's NMEA parsing routines that adds the NMEA checksum to the GPRMC structure.
 
 
  	  | Code: |  	  | ///////////////////////////////////////////////////////////////////////////////
 #include <string.h>
 #include <stdlib.h>
 ///////////////////////////////////////////////////////////////////////////////
 typedef struct _DateTimeInfo
 {
 int8 Day;
 int8 Month;
 int8 Year;
 int8 Hour;
 int8 Minute;
 int8 Second;
 } DateTimeInfo;
 ////////////////////////////////////////
 typedef struct _GPRMCInfo
 {
 char Valid;
 DateTimeInfo DT;
 float Latitude;
 char N_S;
 float Longitude;
 char E_W;
 float Speed;
 int8 Checksum;
 } GPRMCInfo;
 ///////////////////////////////////////////////////////////////////////////////
 //copy string (pos n to pos m) from s2 to s1
 char* StrnmCpy(char *s1, char *s2, size_t n, size_t m)
 {
 int8 i;
 char *s;
 
 for (s=s1, i=n, s2+=n; i<=m; i++)
 *s++ = *s2++;
 *s = '\0';
 
 return s1;
 }
 ///////////////////////////////////////////////////////////////////////////////
 // find c in s starting from pos st
 int8 StrFnd(char *s, char c, size_t st)
 {
 int8 l;
 
 for (l=st, s+=st ; *s != '\0' ; l++, s++)
 if (*s == c)
 return l;
 return -1;
 }
 ///////////////////////////////////////////////////////////////////////////////
 void GPRMC_decode(char *GPRMCStr, GPRMCInfo *RMCInfo)
 {
 int8 p1, p2;
 int8 TempVal;
 char TempStr[16];
 
 p1 = StrFnd(GPRMCStr, ',', 0);      //find first comma
 if (p1 == 6)
 {
 //check for valid packet:
 if ( (StrFnd(GPRMCStr, 'A', p1+1) == 18) && (GPRMCStr[0]=='$')) //valid?
 {
 RMCInfo->Valid = 'A';
 
 //Get time
 p1 = StrFnd(GPRMCStr, ',', 0);      //find first comma
 p2 = StrFnd(GPRMCStr, ',', p1+1);   //find next comma
 RMCInfo->DT.Hour = atoi(StrnmCpy(TempStr, GPRMCStr, p1+1, p1+2));   //hour
 RMCInfo->DT.Minute = atoi(StrnmCpy(TempStr, GPRMCStr, p1+3, p1+4)); //min
 RMCInfo->DT.Second = atoi(StrnmCpy(TempStr, GPRMCStr, p1+5, p1+6)); //sec
 
 //Get latitude & direction
 p1 = StrFnd(GPRMCStr, ',', p2+1);   //find next comma
 p2 = StrFnd(GPRMCStr, ',', p1+1);   //find next comma
 RMCInfo->Latitude = atof(StrnmCpy(TempStr, GPRMCStr, p1+1, p2-1));
 RMCInfo->N_S = GPRMCStr[p2+1];
 
 //Get longitude & direction
 p1 = StrFnd(GPRMCStr, ',', p2+1);   //find next comma
 p2 = StrFnd(GPRMCStr, ',', p1+1);   //find next comma
 RMCInfo->Longitude = atof(StrnmCpy(TempStr, GPRMCStr, p1+1, p2-1));
 RMCInfo->E_W = GPRMCStr[p2+1];
 
 //Get speed
 p1 = StrFnd(GPRMCStr, ',', p2+1);   //find next comma
 p2 = StrFnd(GPRMCStr, ',', p1+1);   //find next comma
 RMCInfo->Speed = atof(StrnmCpy(TempStr, GPRMCStr, p1+1, p2-1));
 
 //Get date
 p1 = StrFnd(GPRMCStr, ',', p2+1);   //find next comma
 p2 = StrFnd(GPRMCStr, ',', p1+1);   //find next comma
 RMCInfo->DT.Day = atoi(StrnmCpy(TempStr, GPRMCStr, p1+1, p1+2));  //dd
 RMCInfo->DT.Month = atoi(StrnmCpy(TempStr, GPRMCStr, p1+3, p1+4));//mm
 RMCInfo->DT.year = atoi(StrnmCpy(TempStr, GPRMCStr, p1+5, p1+6)); //yy
 
 //Get checksum
 p1 = StrFnd(GPRMCStr, '*', 0);   //find first asterisk
 TempStr[0]='0';
 TempStr[1]='x';
 StrnmCpy(TempStr+2, GPRMCStr, p1+1, p1+2);
 RMCInfo->Checksum = atoi(TempStr);
 }
 else                                //not valid
 {
 RMCInfo->Valid = 'V';
 }
 }
 }
 ///////////////////////////////////////////////////////////////////////////////
 
 | 
 
 Jack
 |  |  
		|  |  
		|  |  
  
	| 
 
 | You cannot post new topics in this forum You cannot reply to topics in this forum
 You cannot edit your posts in this forum
 You cannot delete your posts in this forum
 You cannot vote in polls in this forum
 
 |  
 Powered by phpBB © 2001, 2005 phpBB Group
 
 |