?? gps.c
字號:
}
PPi++;
if (j++ > 20)
return FALSE;
}while (*Pi != ','); //角度
*PPi = 0;
f= atof((char *)(&buf[0]));
tmp = (INT8U)(f/2);
TzGpsData.Cog = tmp;
if (TzGpsData.Speed < 5)
{
TzGpsData.Cog = 0;
}
}
j=0;
do{
if (j++ > 20)
return FALSE;
}while (GPSData[i++] != ',');
}
else
{
j=0;
do
{
if (j++ > 20)
return FALSE;
}while (GPSData[i++] != ',');
}
Pi = &GPSData[i];
PPi = &buf[0];
if (GPSData[i] != ',')
{
j = 0;
do{
*PPi = *Pi++;
if ((*PPi < 0x30) || (*PPi > 0x39))
{
return FALSE;
}
PPi++;
if (j++ > 12)
return FALSE;
}while (*Pi != ','); //日期
}
memcpy (&GPSRecData.GPSTime[6],&buf[0],6);
if (0 == TzGpsData.State.GpsState)
{
TzGpsData.State.GpsState = 1;
WriteGPS ();
}
return TRUE;
}
//分析GPGGA數據
INT8U anlyGPSGGA (INT8U *GPSData)
{
INT16U i,j;
INT8U buf[6];
// INT8U GPSData[]= "$GPGGA,084008.00,3201.83882,N,11849.57003,E,1,05,2.52,31.7,M,5.3,M,,*56";
//
i=0;
j=0;
while (GPSData[i++] != ',')
{
if (j++ > 20)
return FALSE;
}
j=0;
while (GPSData[i++] != ',') //時間
{
if (j++ > 20)
return FALSE;
}
j=0;
while (GPSData[i++] != ',') //緯度
{
if (j++ > 20)
return FALSE;
}
j=0;
while (GPSData[i++] != ',') //南北緯
{
if (j++ > 20)
return FALSE;
}
j=0;
while (GPSData[i++] != ',') //經度
{
if (j++ > 20)
return FALSE;
}
j=0;
while (GPSData[i++] != ',') //東西經
{
if (j++ > 20)
return FALSE;
}
j=0;
while (GPSData[i++] != ',') //定位
{
if (j++ > 20)
return FALSE;
}
if (GPSData[i] != ',')
{
buf[0] = GPSData[i++];
buf[1] = GPSData[i++];
buf[2] = 0;
SateNum = atoi((char *)&buf[0]); //衛星個數
j=0;
do
{
if (j++ > 2)
return FALSE;
}while (GPSData[i++] != ',');
return TRUE;
}
/*
j=0;
while (GPSData[i++] != ',') //HTOP
{
if (j++ > 20)
return FALSE;
}
j=0;
while (GPSData[i++] != ',') //海拔高度
{
buf[0] = GPSData[i++];
buf[1] = GPSData[i++];
buf[2] = GPSData[i++];
buf[3] = GPSData[i++];
buf[4] = GPSData[i++];
buf[5] = 0;
altitude = atoi((char *)&buf[0]);
j=0;
do
{
if (j++ > 2)
return FALSE;
}while (GPSData[i++] != ','); //衛星個數
return TRUE;
}
*/
return FALSE;
}
//查找GPS數據包
// cmpbuf 需要查找的字符串
// buf 包含要查找的數據包的數據幀
// len 數據幀長度
INT8U FindGPS (INT8U *cmpbuf,INT8U *buf,INT8U *SrcBuf,INT16U len)
{
INT8U GPSData[100]; //GPRMC數據
INT8U arr[6];
INT8U CRCarr[2];
INT8U *pGPSbuf;
INT8U *pGPSData;
INT8U CRCGPS;
INT16U i;
memset(&GPSData[0],0,100);
pGPSbuf = SrcBuf;
//接收數據
i = 0;
while (1){
while(*pGPSbuf++ != '$') //查找GPS報頭
{
if(i++ > (len - 60)) //
{
// TestSendStr("NO GPS Data!\r\n");
GPSErrFlg++;
return FALSE;
}
}
GPSErrFlg = 0; //找到數據報頭,即認為GPS模塊工作正常
TzGpsDataB.State.GpsMoudleEr = 0;
if((*pGPSbuf++ == cmpbuf[0])&&(*pGPSbuf++ == cmpbuf[1])&&(*pGPSbuf++ == cmpbuf[2])
&&(*pGPSbuf++ == cmpbuf[3])&&(*pGPSbuf++ == cmpbuf[4]))
{
i += 6;
pGPSData = &GPSData[0];
*pGPSData++ = '$';
*pGPSData++ = cmpbuf[0];
*pGPSData++ = cmpbuf[1];
*pGPSData++ = cmpbuf[2];
*pGPSData++ = cmpbuf[3];
*pGPSData++ = cmpbuf[4];
do{
if (i > len) //長度錯誤
{
if (!(memcmp (&cmpbuf[0],"GPRMC",5)))
{
if (1 == TzGpsDataB.State.GpsState)
{
WriteGPS ();
}
TzGpsDataB.State.GpsState = 0;
}
return FALSE;
}
*pGPSData++ = *pGPSbuf++;
i++;
}while(*pGPSbuf != '*');
*pGPSData++ = *pGPSbuf++; // 讀取‘*’
if (i < (len-1)) //讀取校驗
{
CRCarr[0] = *pGPSbuf++;
CRCarr[1] = *pGPSbuf++;
break;
}
if (!(memcmp (&cmpbuf[0],"GPRMC",5)))
{
if (1 == TzGpsDataB.State.GpsState)
{
WriteGPS ();
}
TzGpsDataB.State.GpsState = 0;
}
return FALSE;
}
}
//判斷校驗和
i = 0;
CRCGPS = 0;
CRCGPS ^= cmpbuf[0];
CRCGPS ^= cmpbuf[1];
CRCGPS ^= cmpbuf[2];
CRCGPS ^= cmpbuf[3];
CRCGPS ^= cmpbuf[4];
pGPSData = &GPSData[6];
while(*pGPSData != '*')
{
CRCGPS ^= *pGPSData++;
if(i++ > 80)
{
if (!(memcmp (&cmpbuf[0],"GPRMC",5)))
{
if (1 == TzGpsDataB.State.GpsState)
{
WriteGPS ();
}
TzGpsDataB.State.GpsState = 0;
}
TestSendStr("GPS_LEN_Er\r\n");
return FALSE;
}
}
BcdToAsc(arr,&CRCGPS,1);
if ((arr[0] != CRCarr[0]) && (arr[1] != CRCarr[1]))
{
if (!(memcmp (&cmpbuf[0],"GPRMC",5)))
{
if (1 == TzGpsDataB.State.GpsState)
{
WriteGPS ();
}
TzGpsDataB.State.GpsState = 0;
}
TestSendStr("GPS_CRC_Er\r\n");
return FALSE;
}
memcpy(&buf[0],&GPSData[0],100);
return TRUE;
}
//$GPRMC,,V,,,,,,,,,,N*53
//GPRMC ,080515.000 ,V ,3201.8318 ,N ,11849.5894 ,E ,0.00 ,0.00 ,151204 ,,*19
// 1 2 3 4 5 6 7 8 9
//gps_buf[18];//經度 4 + 緯度 4 + 速度 2 + 時間 6 + 設備狀態 1 + IO狀態 1
/*****************************************************
功能:
將接收緩沖區的數據轉化為系統規定的格式
校驗并獲取定位數據,返回1表示收到定位數據
入參:
無
返回:
0:未定位
1:定位數據
****************************************************/
INT8U VeriGpsData(void)
{
INT8U GPSData[100]; //GPRMC數據
INT8U RMC[6] = "GPRMC";
INT8U GGA[6] = "GPGGA";
// INT8U GPSSrcData[1000];
INT8U cc;
INT16U len;
// double StartLat,StartLong,EndLat,EndLong;
// INT32U DistancTemp;
//--- 檢測GPS天線
cc = GetPin(ANTGPS);
if(0 == cc)
{
TzGpsDataB.State.GpsAnti = 0;
}
else
{
TzGpsDataB.State.GpsAnti = 1;
TzGpsDataB.State.GpsState = 0;
}
if (UARTBUFDATA[GPSCOMM].COMRcvNum > 1000)
{
len = 1000;
}
else
len = UARTBUFDATA[GPSCOMM].COMRcvNum;
if (GPSBuFlag)
{
GPSPOSNum++;
}
// memset(&GPSSrcData[0],0,600);
// memcpy (&GPSSrcData[0],&UARTBUFDATA[GPSCOMM].COMBUF[0],len);
if ((FindGPS (&RMC[0],&GPSData[0],&UARTBUFDATA[GPSCOMM].COMBUF[0],len)))
{
// if (1 == BaseTestFlg)
// {
// TestSendStr(" GPS OK!\r\n");
// }
// TestSendStr("/");
//分析GPS-GPRMC數據
if (anlyGPS (&GPSData[0]))
{
if (TzGpsDataB.State.GpsState)
{
OS_ENTER_CRITICAL();
memcpy(&TzGpsDataB.Lanti[0],&TzGpsData.Lanti[0],10);
OS_EXIT_CRITICAL();
OSSemPost (GPSsem);
}
}
}
else
{
TestSendStr("/");
// TestSend (&UARTBUFDATA[GPSCOMM].COMBUF[0],UARTBUFDATA[GPSCOMM].COMRcvNum);
}
if ((FindGPS (&GGA[0],&GPSData[0],&UARTBUFDATA[GPSCOMM].COMBUF[0],len)))
{
//分析GPS-GPGGA數據
anlyGPSGGA (&GPSData[0]);
return TRUE;
}
return FALSE;
}
void GetGpsTime(INT8U *buf)
{
INT8U cc;
AscToBcd(buf,&GPSRecData.GPSTime[6],6);//ddmmyy
cc = buf[0];
buf[0] = buf[2];
buf[2] = cc; //yymmdd
AscToBcd(buf+3,&GPSRecData.GPSTime[0],6);//hhmmss
}
//檢測GPS模塊是否正常工作
//檢測方法:連續40次沒有接收到GPS數據幀的報頭'$',則GPS模塊損壞
void checkGPS (void)
{
if (GPSErrFlg > 40)
{
TzGpsDataB.State.GpsMoudleEr = 1;
GPSErrFlg = 0;
ClrPin(RSTGPS);
TzGpsDataB.State.GpsState = 0;
OSTimeDly(OS_TICKS_PER_SEC);
SetPin(RSTGPS);
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -