对NMEA协议的每一条数据进行验证,GPS数据从$开始到*之间的所有ASCII码的异或校验和,代码如下:
int CalcCheck(BYTE* Bytes,int len)
{
int i, result;
for (result = Bytes[0], i = 1; i < len ; i++)
{
result ^= Bytes[i];
}
return result;
}
void ReadGPSFile(CString filePath)
{
CStdioFile file;
ret = file.Open(filePath,CFile::modeRead);
if(!ret)
{
CString msg;
msg.Format(_T("文件 %s 打开失败,无法解析相关情况!"),filePath);
AfxMessageBox(msg);
return;
}
CString data;
while(file.ReadString(data))
{
if(data.IsEmpty())
{
continue;
}
//获取校验位数据
int nIdx = data.Find('*');
if(nIdx == -1)
{
continue;
}
CString check = data.Right(data.GetLength() - nIdx - 1);
int checkData;
check.Format(_T("%d"),strtoul(check, NULL, 16));//转成10进制字符串
checkData = _ttoi(check);
//去掉校验位数据
data = data.Left(data.GetLength() - (data.GetLength() - (data.ReverseFind('*'))));
CString checkStr = data.Right(data.GetLength() - 1); //去掉$
BYTE * buf = (BYTE *)checkStr.GetBuffer();
int checkSum = CalcCheck(buf,checkStr.GetLength());
if(checkData != checkSum)
{
continue;
}
//数据验证成功,进行其他操作
}