?? gps_receive.c.bak
字號:
/****************************************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的每幀數(shù)據(jù)以'$'開始,以'\r\n'結(jié)尾。中間以','分隔每字段。需要處理的幀數(shù)據(jù)有:
* 分別以"$GPRMC", "$GPGGA","$GPGSV"開始的數(shù)據(jù)幀。只需將經(jīng)度、緯度、衛(wèi)星個數(shù)、速度等字段取出即可。
***************************************************************************************************************/
void OSGPSRecTask(void *pdata)
{
char szLat[11] = {0}; // 緯度寄存器
char szLon[11] = {0}; // 經(jīng)度寄存器
char szTime[6] = {0}; // 時間寄存器
char szDate[6] = {0}; // 日期寄存器
char szSpeed[15]={0}; // 速率寄存器
char szState[32]={0}; // 衛(wèi)星個數(shù)寄存器
//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; // 字符串轉(zhuǎn)換為整型
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++)//讀取經(jīng)度
{
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); // 日期 字符串轉(zhuǎn)換為整型
Date[0] = szDate[2];
Date[1] = szDate[3];
sDate.wMonth = atoi(Date); // 月期 字符串轉(zhuǎn)換為整型
Date[0] = szDate[4];
Date[1] = szDate[5];
sDate.wYear = atoi(Date); // 月期 字符串轉(zhuǎn)換為整型
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++)//讀取經(jīng)度
{
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狀態(tài)批示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 + -