龚建伟的书 < <visual c++_turbo c串口通信编程实践> > 中有一个实例,其中有段代码如下:
使用的是NMEA-0183无线通信协议,原文是这样说的:
假设我们将串字符数组为:str中包括XXXXX,,①,②,③,④,......(注意不含$和*),设其长度为strlen,则可以通过以下程序段得到校验和
void CSerialPortTestDlg::SendNMEAData(CString &strData)
{
char checksum=0,cr=13,ln=10;
char c1,c2; //2个 半Bype 校验值 ,半Byte?
for(int i=0;i<strData.GetLength();i++)
checksum = checksum^strData[i]; //这一段看起来像是异或校验法,不知道对不对?
c2=checksum & 0x0F;
c1=((checksum >> 4) & 0x0F); if (c1 < 10) c1+= '0'; //将c1转化为ASCII字符,这是怎么实现的啊,没看明白?
else c1 += 'A' - 10; if (c2 < 10) c2+= '0';
else c2 += 'A' - 10; //这下面的都明白,就这段if语句不理解 CString strNMEAData;
//加上包头,尾和校验值和回车换行符
strNMEAData='$'+strData+"*"+c1+c2+cr+ln;
//以下几行程序关不通用,在自己的程序中注意修改
m_SerialPort.WriteToPort((LPCTSTR)strNMEAData);
m_strEditSendMsg.Format("发送的数据包为:%s",strNMEAData);
UpdateData(FALSE); //在发送显示编辑框中显示发送的数据包
}
首先一点就是,不明白他说中说那个什么半Byte校验,不知道校验和是怎么计算的,还是就是将c1,c2转化为ASCII的过程也不明白,各位帮忙解释以下啊!
使用的是NMEA-0183无线通信协议,原文是这样说的:
假设我们将串字符数组为:str中包括XXXXX,,①,②,③,④,......(注意不含$和*),设其长度为strlen,则可以通过以下程序段得到校验和
void CSerialPortTestDlg::SendNMEAData(CString &strData)
{
char checksum=0,cr=13,ln=10;
char c1,c2; //2个 半Bype 校验值 ,半Byte?
for(int i=0;i<strData.GetLength();i++)
checksum = checksum^strData[i]; //这一段看起来像是异或校验法,不知道对不对?
c2=checksum & 0x0F;
c1=((checksum >> 4) & 0x0F); if (c1 < 10) c1+= '0'; //将c1转化为ASCII字符,这是怎么实现的啊,没看明白?
else c1 += 'A' - 10; if (c2 < 10) c2+= '0';
else c2 += 'A' - 10; //这下面的都明白,就这段if语句不理解 CString strNMEAData;
//加上包头,尾和校验值和回车换行符
strNMEAData='$'+strData+"*"+c1+c2+cr+ln;
//以下几行程序关不通用,在自己的程序中注意修改
m_SerialPort.WriteToPort((LPCTSTR)strNMEAData);
m_strEditSendMsg.Format("发送的数据包为:%s",strNMEAData);
UpdateData(FALSE); //在发送显示编辑框中显示发送的数据包
}
首先一点就是,不明白他说中说那个什么半Byte校验,不知道校验和是怎么计算的,还是就是将c1,c2转化为ASCII的过程也不明白,各位帮忙解释以下啊!
c1=((checksum >> 4) & 0x0F);FF -> F,F 2 nib
c1=((checksum >> 4) & 0x0F); 这个是获得checksum的低字节
我不懂的是下一段代码,就是那个if语句里转化为ASCII码的意思:c1+= '0';这个是什么意思c1 += 'A' - 10;这个又是什么意思,怎么就转换成ASCII码了?
帮忙再讲讲啊,小弟先谢谢了!
int HexValue(unsigned char a)
{
a -= 48;
if(a > 9 ) a -= 7;
return a;
}//