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

📄 gps.c

📁 Analysis of GPS data frame The design of the following four main data collection format: GPGGA (loc
💻 C
字号:
//////////////////////////////////////
int gps(void)  //GPS操作线程
{	char databuf[4097];
        char gpsbuf[4097];
	int rdlen, i;
	char *p_addr=NULL;
	//char *p;
	struct timeval tv;
	int count;

	tv.tv_sec = 1;
	tv.tv_usec = 0;
	
	//ptv_t ptv=NULL; 	//struct time out;	
			
//while(1)								//read the data
//	{
		bzero(databuf, sizeof(databuf));

		bzero(gpsbuf, sizeof(gpsbuf));

		bzero(ngps_w_d, sizeof(ngps_w_d));
		bzero(ngps_w_f, sizeof(ngps_w_f));

		bzero(ngps_j_d, sizeof(ngps_j_d));
		bzero(ngps_j_f, sizeof(ngps_j_f));

		bzero(ngps_stime, sizeof(ngps_stime));
		bzero(ngps_speed, sizeof(ngps_speed));
		bzero(ngps_sate_num, sizeof(ngps_sate_num));
	
		
		//sleep(1);
		rdlen = collgps_recPort(fd_gps,  databuf, &tv, GPSMFLAG);
		if(rdlen > 0)
	       // for(i=0; i<rdlen; i++)
		//		printf("0x%.2x,",databuf[i]);
		
		      sprintf(gpsbuf, "%s", databuf); 				//put the data in gpsbuf

		#ifdef GPSDEBUG     
		printf("recv:\n%s", gpsbuf);
		#endif

// getchar();
		 if(( p_addr = strstr(gpsbuf,  "RMC")) != NULL)
                 {      
                        // p_addr = p;
                        #ifdef GPSDEBUG 
                         printf("$GPRMC:\n");
			#endif
                          count = 0;
			//  printf("p-addr= %c\n", *p_addr);
                          while(*p_addr != '*')
                          {

			      // printf("test5 if ,,\n");
				   
                              if(*p_addr == ',')
                              	{
                              	   // printf("test1 if ,,\n");
				    count++;

				    #ifdef GPSDEBUG
				    printf("%d  ", count);
				    #endif
				    p_addr++;
                              	}
			      else{
//printf("p_addr= %c\n", *p_addr);
					p_addr++;
				        continue;
			      	}
				  
			      //printf("test2 if ,,\n");
			      if(*p_addr != ',')
			        {
			           switch(count)
			           {
			                case 1:
					         { 
                                                     strget(p_addr, 0, 6, ngps_stime);
						//    ngps_stime[6]='\0';
						//   printf("jl test ngps_stime=%s\n", ngps_stime);
                                                #ifdef GPSDEBUG
						printf("tt\n");
						#endif						
						         p_addr +=6;
						//	printf("tt2\n");	 
						     break;
			                	 }
					case 2:
						{
						     if(*p_addr == 'A')
						     	{
                                                        #ifdef GPSDEBUG
				                        printf("the gps data A or V:: %c ! \n", *p_addr);
                                                        #endif
					                 // printf("the gps data availability!\n");
				                        // printf("please input write_lamp 1\n");
						     	}
							 
						     p_addr +=1;
						    break;
						}
					case 3://w
						{
						      strget(p_addr, 0, 2, ngps_w_d);
						      ngps_w_d[2] = '\0';
                                                      #ifdef GPSDEBUG
						      printf("dtest gps_w_d=%s\n", ngps_w_d);
                                                      #endif
							  
						      p_addr +=2;
						      strget(p_addr, 0, 2, ngps_w_f);
						      p_addr +=3; //.
						      strput(ngps_w_f, 2, p_addr, 0, 4);
						      ngps_w_f[6] = '\0';
                                                      #ifdef GPSDEBUG
						      printf("dtest gps_w_f=%s\n", ngps_w_f);
						      #endif						  
						      p_addr +=4;
						     // printf("test test\n");
						      break;
						}
					case 4:
						{
							ngps_w = *p_addr;
							p_addr  +=1;
                                                        #ifdef GPSDEBUG
							printf("dtest gps_w=%c\n", ngps_w);
							#endif
							break;
						}
					case 5://J
						{
							 strget(p_addr, 0, 3, ngps_j_d);
							 ngps_j_d[3] = '\0';
                                                         #ifdef GPSDEBUG
							printf("dtest gps_j_d=%s\n", ngps_j_d);
							#endif
							
							 p_addr +=3;
							 strget(p_addr, 0, 2, ngps_j_f);
							 p_addr +=3;//.
					                 strput(ngps_j_f, 2, p_addr, 0, 4);
							 ngps_j_f[6] = '\0';
                                                         #ifdef GPSDEBUG
							 printf("dtest gps_j_f=%s\n", ngps_j_f);
						         #endif
                					p_addr +=4;							 
							 break;
						}
					case 6:
						{
							  ngps_j = *p_addr;
							  p_addr +=1;
							  #ifdef GPSDEBUG
	                                                  printf("dtest gps_j=%c\n", ngps_j);
							  #endif
							  break;
						}
					case 7:
						{
							 strget(p_addr, 0, 3, ngps_speed);
							 p_addr +=4;//.
							 strput(ngps_speed, 3, p_addr, 0, 1);
							 ngps_speed[4] = '\0';
							 p_addr +=1;
                                                        #ifdef GPSDEBUG
							 printf("dtest speed ::%s\n ", ngps_speed);   
							#endif						  
							 break;
						}
					case 8:
						{
							p_addr +=4;//.
							p_addr +=1;//,
//							printf("course over groud\n");
							break;
						}
					case 9:
						{
							strput(ngps_stime, 6, p_addr, 0, 6);
							p_addr +=6;
							p_addr +=1;
							ngps_stime[12] = '\0';
						//     printf("gps set time\n");
                                                //     gps_set_time(ngps_stime);	//ok
							#ifdef GPSDEBUG
                                                      	printf("UTC time ::%s\n ", ngps_stime);
							#endif
							break;
						}
					default :
						{
							break;
						}
			           }
			      	}
				else
				{
				        //p_addr++;
					continue;
				}
                            }
		 }
//		 getchar();
		 if((p_addr = strstr(gpsbuf, "GGA")) != NULL)
		 {
                        #ifdef GPSDEBUG
			printf("\n$GPGGA:\n");
			#endif			
			// p_addr = p;
                          count = 0;
                          while(*p_addr != '*')
                          {
                              if(*p_addr == ',')
                              	{
				    count++;
				   #ifdef GPSDEBUG	
				    printf("%d  ", count);
				   #endif
				    p_addr++;
                              	}
			       else{
//printf("p_addr= %c\n", *p_addr);
					p_addr++;		
				        continue;
			      	}
							  
			      if(*p_addr != ',')
			      {
			           switch(count)
			           {
			                case 6:
					         { 
                                                    gps_status = *p_addr;
						    if(gps_status == '0')
							   alarm_enable = 1;
						  //  else
						//	   alarm_enable = 0;
						    #ifdef GPSDEBUG	
						    printf("gps_status = %c\n",  gps_status);
						    #endif
						     p_addr +=1;
						     break;
			                	 }
					case 7:
						{
							
			                             strget(p_addr, 0, 2, ngps_sate_num);
						     ngps_sate_num[2] = '\0';
						      #ifdef GPSDEBUG
			                             printf("gps sate  %s nums.\n", ngps_sate_num);
						     #endif  
						     p_addr +=2;
						     break;
						}
					default:
						{
							break;
						}
			            }
			      	}
				else
					continue;
			      	
                          }
		}
        // }
           //close(fd_gps);
     return 0;
}


void catch_alrm(int signo)   
{
	//Block signal
	char data_buf[128];
	
	//sigprocmask(SIG_BLOCK, &sig_set, NULL);
	
	//check ONLINE?
	
	
	//printf("~~0_o~~\n");	
	//printf("B: %3d,%1d  C: %2d,%1d  W: %2d,%1d \n", poll_flag,poll_enable, track_flag,track_enable, alarm_flag,alarm_enable);

	if(ON_LINE == 0)
		pthread_exit(NULL); //exit circle pthread 

	if((poll_enable == 1 )&&(poll_flag == 0 )) 
		{
			poll_flag = atoi(polling_interval) *60;

			B_FLAG = 1;
			#if 0
			send_flag = 'B';
			coll_data(NULL, 'L', data_buf);

			send_data_mc(data_buf);
			#endif
			//send_data();
		}	
	else if(poll_enable == 1) poll_flag--;
	

	if((track_enable ==1 )&&(track_flag == 0 ))
		{
			track_flag = atoi(track_interval)*60;

			C_FLAG = 1;
			#if 0
			send_flag = 'C';
			coll_data(NULL, 'L', data_buf);

			send_data_mc(data_buf);
			#endif
			//send_data();
		}
	else if(track_enable ==1 ) track_flag--;

	if((sw_enable ==1 )&&(sw_flag == 0 ))
		{
			sw_flag = atoi(sw_interval)*60;

			N_FLAG = 1;
			#if 0
			send_flag = 'N';
			coll_data(NULL, 'N', data_buf);

			send_data_mcsw(data_buf);
			#endif
			//send_data();
		}
	else if(sw_enable ==1 ) sw_flag--;
	

	if((alarm_enable ==1 )&&(alarm_flag == 0 ))
		{
			alarm_flag = atoi(alarm_interval)*60;

			W_FLAG = 1;
			#if 0
			send_flag = 'W';
			coll_data(NULL, 'L', data_buf);

			send_data_mc(data_buf);
			#endif
			//send_data();
		}
	else if(alarm_enable ==1 ) alarm_flag--;

		//flush
	write_lamp=1;
       gps(); //GPS操作线程
        write_lamp=0;
        
	
	//signal(SIGALRM, catch_alrm);

	//sigprocmask(SIG_UNBLOCK, &sig_set, NULL);
	//write_lamp = 1;
	
	//write_lamp =0;
		
	

}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -