|
楼主 |
发表于 2008-6-5 12:54:26
|
显示全部楼层
另外,本人对机械结构也比较熟悉。
先贴一段分析GPS数据的代码,使用的CPU是ATMEGA64,从环形缓冲里面取出GPS数据,并判断数据是否有效,获取的数据包括
经度
纬度
高度
速度
角度
有效卫星数
GPS信号有效否
时间,包括时区调整
环形指针的移动不在这里处理:
//Not Chang Head's Position
void AnlzGPSData(custBUFF *pBuff, char *pEnd)
{
unsigned char iLoop, iCount;
char * pCharTemp, *pTH;
unsigned char iLen = 0;
char * pBitwiseEnd;
char cCalSum = 0, cGetSum = 0;
pTH = (char*)(pBuff->pCurrH); //Save Head
pCharTemp = FindBFStr(pBuff, strGPGGA, pEnd); //$GPGGA
if(pCharTemp)
{
SET_HEAD(pBuff, pCharTemp);
//Make Sure The Message String be Valid
pBitwiseEnd = FindBFStr(pBuff, "*", pEnd);
if(pBitwiseEnd == 0)
{
return;
}
iLen = HD2PTR_LEN(pBuff, pBitwiseEnd);
iLen -= 1;
GetBFStr(g_pExtBuff, pBuff, iLen);
for(iLoop = 1; iLoop < iLen; iLoop ++)
{
cCalSum ^= g_pExtBuff[iLoop];
}
PTR_INC(pBuff, pBitwiseEnd);
g_pStrTemp[0] = *pBitwiseEnd;
PTR_INC(pBuff, pBitwiseEnd);
g_pStrTemp[1] = *pBitwiseEnd;
g_pStrTemp[2] = '\0';
cGetSum = HEXStr2Int(g_pStrTemp);
if(cCalSum != cGetSum)
{//Invalid data string
Send2PC("Invalid Data string:",strlen("Invalid Data string:"));
Send2PC(g_pExtBuff, iLen);
Send2PC("\r\n", 2);
return;
}
SET_HEAD(pBuff, pCharTemp);
MOV_HEAD(pBuff, strlen(strGPGGA));
pCharTemp = FindBFSplit(pBuff, ','); //Time
/*
iCount = HD2PTR_LEN(pBuff, pCharTemp);
iCount -= 1; //-1 for Not include ','
GetBFStr(g_tagGPSData.gpsTime, pBuff, iCount);
g_tagGPSData.gpsTime[4] = *(char*)(pBuff->pCurrH + 4);
g_tagGPSData.gpsTime[5] = *(char*)(pBuff->pCurrH + 5);
*/
PTR_INC(pBuff, pCharTemp);
SET_HEAD(pBuff, pCharTemp);
pCharTemp = FindBFSplit(pBuff, ','); //Latitude
iCount = HD2PTR_LEN(pBuff, pCharTemp);
iCount -= 1;
GetBFStr(g_tagGPSData.Latitude, pBuff, iCount);
PTR_INC(pBuff, pCharTemp);
SET_HEAD(pBuff, pCharTemp);
pCharTemp = FindBFSplit(pBuff, ','); //N/S Indicator
iCount = HD2PTR_LEN(pBuff, pCharTemp);
iCount -= 1;
GetBFStr(g_tagGPSData.NSIndicator, pBuff, iCount);
PTR_INC(pBuff, pCharTemp);
SET_HEAD(pBuff, pCharTemp);
pCharTemp = FindBFSplit(pBuff, ','); //Longitude
iCount = HD2PTR_LEN(pBuff, pCharTemp);
iCount -= 1;
GetBFStr(g_tagGPSData.Longitude, pBuff, iCount);
PTR_INC(pBuff, pCharTemp);
SET_HEAD(pBuff, pCharTemp);
pCharTemp = FindBFSplit(pBuff, ','); //E/W indicator
iCount = HD2PTR_LEN(pBuff, pCharTemp);
iCount -= 1;
GetBFStr(g_tagGPSData.EWindicator, pBuff, iCount);
PTR_INC(pBuff, pCharTemp);
SET_HEAD(pBuff, pCharTemp);
pCharTemp = FindBFSplit(pBuff, ','); //Position Fix Indictor
PTR_INC(pBuff, pCharTemp);
SET_HEAD(pBuff, pCharTemp);
g_Satellites = GetReturnNumber(pBuff, ','); //Satellites Used
}
pCharTemp = FindBFStr(pBuff, strGPRMC, pEnd); //$GPRMC
if((pCharTemp) && (g_tagGPSData.gpsDate[0])) //Must be Make Sure Have POS data
{//Only for get Speed & Course & Date
//Make Sure The Message String be Valid
SET_HEAD(pBuff, pCharTemp);
pBitwiseEnd = FindBFStr(pBuff, "*", pEnd);
if(pBitwiseEnd == 0)
{
return;
}
iLen = HD2PTR_LEN(pBuff, pBitwiseEnd);
iLen -= 1;
GetBFStr(g_pExtBuff, pBuff, iLen);
for(iLoop = 1; iLoop < iLen; iLoop ++)
{
cCalSum ^= g_pExtBuff[iLoop];
}
PTR_INC(pBuff, pBitwiseEnd);
g_pStrTemp[0] = *pBitwiseEnd;
PTR_INC(pBuff, pBitwiseEnd);
g_pStrTemp[1] = *pBitwiseEnd;
g_pStrTemp[2] = '\0';
cGetSum = HEXStr2Int(g_pStrTemp);
if(cCalSum != cGetSum)
{//Invalid data string
Send2PC("Invalid Data string:",strlen("Invalid Data string:"));
Send2PC(g_pExtBuff, iLen);
Send2PC("\r\n", 2);
return;
}
SET_HEAD(pBuff, pCharTemp);
MOV_HEAD(pBuff, strlen(strGPRMC));
pCharTemp = FindBFSplit(pBuff, ','); //Time
iCount = HD2PTR_LEN(pBuff, pCharTemp);
iCount -= 1; //-1 for Not include ','
GetBFStr(g_tagGPSData.gpsTime, pBuff, iCount);
PTR_INC(pBuff, pCharTemp);
SET_HEAD(pBuff, pCharTemp);
if(*pBuff->pCurrH == 'A')
{
g_bGPSValid = 1;
}
else
{
g_bGPSValid = 0;
}
for(iLoop = 0; iLoop < 5; iLoop ++)
{
pCharTemp = FindBFSplit(pBuff, ',');
PTR_INC(pBuff, pCharTemp);
SET_HEAD(pBuff, pCharTemp);
}
pCharTemp = FindBFSplit(pBuff, ','); //Speed
iCount = HD2PTR_LEN(pBuff, pCharTemp);
iCount -= 1;
GetBFStr(g_tagGPSData.Speed, pBuff, iCount);
cust_int2str(g_tagGPSData.Speed, 2 * cust_str2int(g_tagGPSData.Speed));
cust_strcpy(&g_tagGPSData.Speed[strlen(g_tagGPSData.Speed)], ".00\0"); //Add .00 for Get it in Protocole
PTR_INC(pBuff, pCharTemp);
SET_HEAD(pBuff, pCharTemp);
pCharTemp = FindBFSplit(pBuff, ','); //Course
iCount = HD2PTR_LEN(pBuff, pCharTemp);
iCount -= 1;
if(iCount > 0)
GetBFStr(g_tagGPSData.Course, pBuff, iCount);
else
cust_strcpy(g_tagGPSData.Course, "0.00\0");
PTR_INC(pBuff, pCharTemp);
SET_HEAD(pBuff, pCharTemp);
pCharTemp = FindBFSplit(pBuff, ','); //Date
iCount = HD2PTR_LEN(pBuff, pCharTemp);
iCount -= 1; //-1 for Not include ','
GetBFStr(g_tagGPSData.gpsDate, pBuff, iCount);
AdjustDateTime(&g_tagGPSData, TIME_ZONE);
}
SET_HEAD(pBuff, pTH); //Restor Head.
}
unsigned char GetGPSValid(void)
{
return g_bGPSValid;
} |
|