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

📄 gps_receive.c.bak

📁 这是一个基于ARM7的GPS处理源代码
💻 BAK
📖 第 1 页 / 共 2 页
字号:
/****************************************Copyright (c)********************************************************
**                   (c) Copyright 2004-2005, ZhaiHai guangdong china  xu.sunny
**                                  All Rights Reserved
**                                zhiping_xu@hotmail.com
**
**-------------------------------------------File Info--------------------------------------------------------
* File          name:  GPS_Receive.c
* Last modified Date:	
* Last       Version:	1.0
* Descriptions      : GPS 接收处理程序 	
*			      
**----------------------------------------------------------------------------------------------------------*/

#define GPS_GLOBALS
#include "config.h"

/***************************************************************************************************************
*                                             OSGPSRecTask
*
* Description: GPS 接收处理任务
*
* Arguments  : 
*              
* Returns    : 
*	         	       
* Note       : GPS的每帧数据以'$'开始,以'\r\n'结尾。中间以','分隔每字段。需要处理的帧数据有:
*              分别以"$GPRMC", "$GPGGA","$GPGSV"开始的数据帧。只需将经度、纬度、卫星个数、速度等字段取出即可。
***************************************************************************************************************/
void OSGPSRecTask(void *pdata)
{       
  char  szLat[11] = {0}; // 纬度寄存器
  char  szLon[11] = {0}; // 经度寄存器
  char  szTime[6] = {0}; // 时间寄存器
  char  szDate[6] = {0}; // 日期寄存器
  char  szSpeed[15]={0}; // 速率寄存器
  char  szState[32]={0}; // 卫星个数寄存器
  //char  szHeight[32]={0};// 读取海平面高度
  //float dCurLat = 0.0;
  //float dCurLot = 0.0;
  uint32 i,j,nIndex = 0,nFindComma = 0;
  void * GPSTemp;
  uint8 err;
  
  pdata = pdata;
  
  //UART0Init(4800);
  GPSData.OSSemGPS_State = 0;
  for (;;)
    {
     	GPSTemp = OSQPend(GPS_REC_QFlag,0,&err);
     	IO0SET = GPS_Detect;
           // GetGPSInfo((UART0DATA*) GPSTemp);
    
	       OS_ENTER_CRITICAL();
           //$GPRMC,174921,A,2216.386,N,11331.650,E,000.0,360.0,311205,001.9,W*6D 
           if ((((UART0DATA *)GPSTemp)->RecBuff[i]  == '$') && (((UART0DATA *)GPSTemp)->RecBuff[i+1] == 'G') && (((UART0DATA *)GPSTemp)->RecBuff[i+2] == 'P' )&
		      (((UART0DATA *)GPSTemp)->RecBuff[i+3] == 'R') && (((UART0DATA *)GPSTemp)->RecBuff[i+4] == 'M') && (((UART0DATA *)GPSTemp)->RecBuff[i+5] == 'C'))
		     {
		       i += 6;
		       if ((Time_Adjust == 1) | (Time_Count == 720))
				 {
		           nIndex = 0;	     
		           for (j = i; j < ((UART0DATA *)GPSTemp)->Rec_Lenght; j++) //读取纬度
		             {
		               if (nFindComma == 1)
			             {
			               if (((UART0DATA *)GPSTemp)->RecBuff[j] != ',')
				             {
				               szTime[nIndex] = ((UART0DATA *)GPSTemp)->RecBuff[j];
				               nIndex++;
				         }
				     }
				   if (((UART0DATA *)GPSTemp)->RecBuff[j] == ',')
				     {
				       nFindComma++;
				       if (nFindComma > 1)
				         {					           
				        	   struct time sTime;
				        	   char k = 0;
				        	   char Time[2] = {0};
				        	   Time_Adjust = 0x00;
				        	   Time_Count  = 0x00;
                               Time[0] = szTime[0];
                               Time[1] = szTime[1]; 
                               k = atoi(Time) + 8;  // 字符串转换为整型 
                               if (k > 0x18) 
                                  sTime.wHour = k - 0x18;
                               else               
				        	      sTime.wHour = k; 
				        	   Time[0] = szTime[2];
                               Time[1] = szTime[3];  
				        	   sTime.wMinute = atoi(Time);
				        	   Time[0] = szTime[4];
                               Time[1] = szTime[5]; 
				        	   sTime.wSecond	= atoi(Time);
				        	   settime(&sTime);
				        	
				           Time_Count++;		          
					       i = j + 2;
					       break;
					      }
				       }
			         }
			     }
			   //$GPRMC,174921,A,2216.386,N,11331.650,E,000.0,360.0,311205,001.9,W*6D						 
		       nIndex = 0;	     
		       for (j = i; j < ((UART0DATA *)GPSTemp)->Rec_Lenght; j++) //读取纬度
		         {
		           if (nFindComma == 3)
			         {
			           if (((UART0DATA *)GPSTemp)->RecBuff[j] != ',')
				           {
				             szLat[nIndex] = ((UART0DATA *)GPSTemp)->RecBuff[j];
				             nIndex++;
				           }
				     }
				   if (((UART0DATA *)GPSTemp)->RecBuff[j] == ',')
				     {
				       nFindComma++;
				       if (nFindComma > 3)
				         {					          
				           int nLatInt = atoi(szLat) / 100;
				           GPSData.dLat = (atof(szLat) - nLatInt * 100) / 60.0 + nLatInt;
					       i = j + 2;
					       break;
					     }
				     }
			     }
			   //$GPRMC,174921,A,2216.386,N,11331.650,E,000.0,360.0,311205,001.9,W*6D						   		     
			   nIndex = 0;
			   for (j = i; j < ((UART0DATA *)GPSTemp)->Rec_Lenght; j++)//读取经度
		         {
			       if (nFindComma == 5)
			         {
			           if (((UART0DATA *)GPSTemp)->RecBuff[j] != ',')
			             {
			               szLon[nIndex] = ((UART0DATA *)GPSTemp)->RecBuff[j];
				           nIndex++;
   			             }
				     }
				   if (((UART0DATA *)GPSTemp)->RecBuff[j] == ',')
				     {
				       nFindComma++;
				       if (nFindComma > 5)
				         {
				           int nLonInt  = atoi(szLon) / 100;
				           GPSData.dLot = (atof(szLon) - nLonInt * 100) / 60.0 + nLonInt; 
				           i = j + 2;
				           break;
				         }
				     }
			     }
			   //$GPRMC,174921,A,2216.386,N,11331.650,E,000.0,360.0,311205,001.9,W*6D
			   nIndex = 0;
               for (j = i; j < ((UART0DATA *)GPSTemp)->Rec_Lenght; j++) // 读取速度
			     {
			       if (nFindComma == 7)
			         {
			           if (((UART0DATA *)GPSTemp)->RecBuff[j] != ',')
			             {
			               szSpeed[nIndex] = ((UART0DATA *)GPSTemp)->RecBuff[j];
				           nIndex++;
				         }
				     }
				   if (((UART0DATA *)GPSTemp)->RecBuff[j] == ',')
				     {
				       nFindComma++;
				       if (nFindComma > 7)
				         {
				           GPSData.iSpeed = atof(szSpeed) * 1.852;
				           i = j + 2;				           
				           break;
				         }
				     }
				 }
			   //$GPRMC,174921,A,2216.386,N,11331.650,E,000.0,360.0,311205,001.9,W*6D 
			   if (Date_Adjust == 0X00)
			     { 
			       nIndex = 0;
			       for (j = i; j < ((UART0DATA *)GPSTemp)->Rec_Lenght; j++) // 读取日期
			         {
			           if (nFindComma == 9)
			             {
			               Date_Adjust = 0X00;
			               if (((UART0DATA *)GPSTemp)->RecBuff[j] != ',')
			                 {
			                   szDate[nIndex] = ((UART0DATA *)GPSTemp)->RecBuff[j];
				               nIndex++;
				             }
				         }  //$GPRMC,174921,A,2216.386,N,11331.650,E,000.0,360.0,311205,001.9,W*6D
				       if (((UART0DATA *)GPSTemp)->RecBuff[j] == ',')
				         {
				           nFindComma++;
				           if (nFindComma > 9)
				             {
				               struct date sDate;
				               char Date[2] = {0};
                               Date[0]    = szDate[0];
                               Date[1]    = szDate[1]; 
                               sDate.wDay = atoi(Date);  // 日期 字符串转换为整型
                               
                               Date[0]      = szDate[2];
                               Date[1]      = szDate[3]; 
                               sDate.wMonth = atoi(Date);  // 月期 字符串转换为整型
                                
                               Date[0]     = szDate[4];
                               Date[1]     = szDate[5];
                               sDate.wYear = atoi(Date);  // 月期 字符串转换为整型
                               sDate.wYear = sDate.wYear + 2000;
                               setdate(&sDate);
                               i = j + 1; 
				               break;
				             }
				         }
			         }
			     }						
		     } 
		   //$GPGGA,174921,2216.386,N,11331.650,E,1,03,5.4,-33.6,M,-3.3,M,,*46   
	       else if ((((UART0DATA *)GPSTemp)->RecBuff[i] =='$') && (((UART0DATA *)GPSTemp)->RecBuff[i+1]=='G') && (((UART0DATA *)GPSTemp)->RecBuff[i+2]=='P') &
				   (((UART0DATA *)GPSTemp)->RecBuff[i+3]=='G') && (((UART0DATA *)GPSTemp)->RecBuff[i+4]=='G') && (((UART0DATA *)GPSTemp)->RecBuff[i+5]=='A'))
		     {
		       i += 35;	// i+=6;	
		       /*nIndex = 0;
		       for (j = i; j < ((UART0DATA *)GPSTemp)->Rec_Lenght;j++) //读取纬度
		         {
		           if (nFindComma == 2)
		             {
			           if (((UART0DATA *)GPSTemp)->RecBuff[j] != ',')
			             {
				           szLat[nIndex] = ((UART0DATA *)GPSTemp)->RecBuff[j];
				           nIndex++;
				         }
				     }
				   if (((UART0DATA *)GPSTemp)->RecBuff[j] == ',')
				     {
				       nFindComma++;
				       if (nFindComma > 2)
				         {					
   			               int nLatInt = atoi(szLat) / 100;
   			               i = j+1;
					       dCurLat = (atof(szLat) - nLatInt * 100) / 60.0+nLatInt;						
					       break;
					     }
				     }
			     }		
			   nIndex=0;
			   for (j = i; j < ((UART0DATA *)GPSTemp)->Rec_Lenght; j++)//读取经度
			     {
				   if (nFindComma == 4)
				     {
					   if (((UART0DATA *)GPSTemp)->RecBuff[j] != ',')
					     {
						   szLon[nIndex] = ((UART0DATA *)GPSTemp)->RecBuff[j];
						   nIndex++;
					     }
				     }				
				   if (((UART0DATA *)GPSTemp)->RecBuff[j] == ',')
				     {
					   nFindComma++;
					   if (nFindComma > 4)
					     {
					       int nLonInt = atoi(szLon) / 100;
						   i = j+1;						
						   dCurLot = (atof(szLon) - nLonInt * 100) / 60.0 + nLonInt;						
						   break;
					     }
				     }
			     }*/
			   for (j = i; j < ((UART0DATA *)GPSTemp)->Rec_Lenght; j++)// GPS状态批示0-未定位 1-无差分定位信息 2-带差分定位信息
			     {
				   if (nFindComma == 1)//if (nFindComma == 6)
				     {
					   if (((UART0DATA *)GPSTemp)->RecBuff[j] != ',')
					     {
					       uint8 GPS_State;
						   GPS_State = ((UART0DATA *)GPSTemp)->RecBuff[j];
                           if ((GPS_State == '1')||(GPS_State == '2'))
                             {  
                               IO0CLR = GPS_Detect;
         	  	               GPSData.OSSemGPS_State =0X01;
         	  	             }
                         }                  
				     }
				   if (((UART0DATA *)GPSTemp)->RecBuff[j] == ',')
				     {
					   nFindComma++;
					   if (nFindComma > 2)//if (nFindComma > 6)						
					       break;
				     }
			     }				
		     }
		  //$GPGSV,3,1,10,01,08,285,49,05,44,088,00,06,00,160,00,09,23,037,00*79                                                                    
          //$GPGSV,3,2,10,14,34,315,52,15,40,211,31,18,67,103,00,21,23,184,31*7C                                                                    
          //$GPGSV,3,3,10,22,62,342,53,30,45,134,00,,,,,,,,*7B  
	      else if((((UART0DATA *)GPSTemp)->RecBuff[i] =='$') && (((UART0DATA *)GPSTemp)->RecBuff[i+1]=='G') && (((UART0DATA *)GPSTemp)->RecBuff[i+2]=='P') &&
				(((UART0DATA *)GPSTemp)->RecBuff[i+3]=='G' ) && (((UART0DATA *)GPSTemp)->RecBuff[i+4]=='S') && (((UART0DATA *)GPSTemp)->RecBuff[i+5]=='V'))

⌨️ 快捷键说明

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