www.pudn.com > gps-c.rar > gps.c


 
 
 
#include  
#include  
#include  
#include  
#include  
#include  
#include  
#include   // Must include . or, the result is wrong!!!!!!!!! 
   
#include     "serial.h" 
#include     "gps.h" 
#include     "comm.h" 
 
#define USE_BEIJING_TIMEZONE 
#define MAXMSGLEN 256 
 
char GPS_BUF[MAXMSGLEN]; 
GPS_INFO gps_info; 
  
int GetCharPos(int num,char* str); 
void UTC2BTC(date_time *GPS); 
double get_double_number(char *s); 
 
//////////////////////////////////////////////////////////////////////// 
// Test main() 
// 
#if 1    
 
#define ENDMINITERM 27 /* ESC to quit miniterm */ 
volatile int STOP=FALSE; 
void child_handler(int s); 
void* keyboard(void * data); 
void* receive(void * data); 
void* show_gps_info(void * data); 
 
 
 
int main(int argc,char** argv) 
{	 
	struct sigaction sa; 
	int ok; 
 	pthread_t th_a, th_b, th_c; 
 	void * retval;	 
 	 
  	GPS_Init(); 
 
  	sa.sa_handler = child_handler; 
  	sa.sa_flags = 0; 
  	sigaction(SIGCHLD,&sa,NULL); /* handle dying child */ 
 
  	pthread_create(&th_a, NULL, keyboard, 0); 
  	pthread_create(&th_b, NULL, receive, 0); 
 
  	pthread_join(th_a, &retval); 
  	pthread_join(th_b, &retval); 
  
  	printf("exit main 1\n"); 
  	close(fd2); 
	printf("exit main 2\n"); 
return(0);	 
} 
void child_handler(int s) 
{ 
  printf("stop!!!\n"); 
   STOP=TRUE; 
} 
void* keyboard(void * data) 
{ 
    int c; 
    c=getchar(); 
    STOP=TRUE; 
	printf("exit keyboard\n"); 
    return NULL; 
} 
void* receive(void * data) 
{ 
	int i=0, tmp=0; 
	char c; 
	char buf[256]; 
   
	GPS_INFO GPS; 
 
	while (STOP==FALSE) {		 
		//tmp = read(fd2,&c,1);  /* 直接阻塞读串口 */ 
		tmp = readport(fd2,2000,&c); 
	  	buf[i++] = c; 
		 
		if(c == '\n'){			 
			buf[i]='\0'; 
			i=0; 
     		if( buf[5]=='C' || (buf[4]=='G'&&buf[5]=='A')){        //"GPRMC"  "$GPGGA" 
				strcpy(GPS_BUF, buf);       			 
				gps_parse(GPS_BUF,&gps_info); 
				show_gps(&gps_info); 
				printf("%s", GPS_BUF); 
   			} 
			 
		} 
    }	 
    printf("exit from reading modem\n"); 
    return NULL;  
} 
 
#endif 
// 
// Test main() 
//////////////////////////////////////////////////////////////////////// 
 
void GPS_Init() 
{ 
  fd2 = OpenDev(COM2);   
  set_speed(fd2,4800);	//设置开发平台的串口2波特率 
  if (set_Parity(fd2,8,1,'N') == FALSE)  { 
		printf("Set Parity Error\n"); 
		exit (0); 
  }  
  usleep(1000000);   
} 
 
 
void show_gps(GPS_INFO *GPS) 
{ 
	printf("DATE       : %d-%02d-%02d \n",GPS->D.year,GPS->D.month,GPS->D.day); 
	printf("TIME       :  %02d:%02d:%02d \n",GPS->D.hour,GPS->D.minute,GPS->D.second); 
	printf("Latitude   : %.4f %c\n",GPS->latitude,GPS->NS); 
	printf("Longitude  : %.4f%c\n",GPS->longitude,GPS->EW); 
	printf("Highness   : %.4f \n",GPS->high); 
	printf("STATUS     : %c\n",GPS->status); 
} 
 
//////////////////////////////////////////////////////////////////////////////// 
//解释gps 
//0      7  0   4 6   0     6 8 0        90         0  3      0        9 
//$GPRMC,091400,A,3958.9870,N,11620.3278,E,000.0,000.0,120302,005.6,W*62 
//$GPGGA,091400,3958.9870,N,11620.3278,E,1,03,1.9,114.2,M,-8.3,M,,*5E 
 
void gps_parse(char *line,GPS_INFO *GPS) 
//////////////////////////////////////////////////////////////////////////////// 
{ 
	int tmp; 
	char c; 
	char* buf=line; 
	c=buf[5]; 
 
 if(buf[0]!='$')return; 
  
	if(c=='C'){//"GPRMC" 
   
		GPS->D.hour   =(buf[ 7]-'0')*10+(buf[ 8]-'0'); 
		GPS->D.minute =(buf[ 9]-'0')*10+(buf[10]-'0'); 
		GPS->D.second =(buf[11]-'0')*10+(buf[12]-'0'); 
		tmp = GetCharPos(9,buf); 
		GPS->D.day    =(buf[tmp+0]-'0')*10+(buf[tmp+1]-'0'); 
		GPS->D.month  =(buf[tmp+2]-'0')*10+(buf[tmp+3]-'0'); 
		GPS->D.year   =(buf[tmp+4]-'0')*10+(buf[tmp+5]-'0')+2000; 
		//------------------------------ 
		GPS->status	  =buf[GetCharPos(2,buf)]; 
		GPS->latitude =get_double_number(&buf[GetCharPos(3,buf)]); 
		GPS->NS       =buf[GetCharPos(4,buf)]; 
		GPS->longitude=get_double_number(&buf[GetCharPos(5,buf)]); 
		GPS->EW       =buf[GetCharPos(6,buf)]; 
#ifdef USE_BEIJING_TIMEZONE 
		UTC2BTC(&GPS->D); 
#endif 
	} 
	if(c=='A'){ //"$GPGGA" 
		GPS->high     = get_double_number(&buf[GetCharPos(9,buf)]);  
	} 
} 
 
double get_double_number(char *s) 
{ 
	char buf[128]; 
	int i; 
	double rev; 
	i=GetCharPos(1,s); 
	strncpy(buf,s,i); 
	buf[i-1]='\0';          
	rev=atof(buf);           
	return rev; 
 
} 
 
//////////////////////////////////////////////////////////////////////////////// 
// 
int GetCharPos(int num,char *str) 
{ 
	int i,j=0; 
	int len=strlen(str); 
	for(i=0;isecond++; // 
		if(GPS->second>59){ 
			GPS->second=0; 
			GPS->minute++; 
			if(GPS->minute>59){ 
				GPS->minute=0; 
				GPS->hour++; 
			} 
		} 
 
//*************************************************** 
		GPS->hour+=8; 
		if(GPS->hour>23) 
		{ 
			GPS->hour-=24; 
			GPS->day+=1; 
			if(GPS->month==2 || 
			   		GPS->month==4 || 
			   		GPS->month==6 || 
			   		GPS->month==9 || 
			   		GPS->month==11 ){ 
				if(GPS->day>30){ 
			   		GPS->day=1; 
					GPS->month++; 
				} 
			} 
			else{ 
				if(GPS->day>31){ 
			   		GPS->day=1; 
					GPS->month++; 
				} 
			} 
			if(GPS->year % 4 == 0 ){// 
		   		if(GPS->day > 29 && GPS->month ==2){ 
		   			GPS->day=1; 
					GPS->month++; 
				} 
			} 
			else{ 
		   		if(GPS->day>28 &&GPS->month ==2){ 
		   			GPS->day=1; 
					GPS->month++; 
				} 
			} 
			if(GPS->month>12){ 
				GPS->month-=12; 
				GPS->year++; 
			} 
		} 
} 
 
void ReceiveOneBL( GPS_INFO* GPS_info) 
{ 
	int i=0, tmp=0; 
	char c; 
	char buf[256];	 
   
	while (1) {		 
	  tmp = read(fd2,&c,1);   
	  buf[i++] = c; 
	  if(c == '\n'){			 
	    buf[i]='\0'; 
	    i=0;	     
     	    if( buf[5]=='C'&&buf[0]=='$') break;           //完整的"GPRMC"	   		  		 
	  } 
  	} 
	gps_parse(buf,GPS_info);	 
  return ;  
}