📄 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 + -