龚建伟的书 < <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的过程也不明白,各位帮忙解释以下啊!

解决方案 »

  1.   

    c2=checksum & 0x0F
    c1=((checksum >> 4) & 0x0F);FF -> F,F 2 nib
      

  2.   

    这个我知道,c2=checksum & 0x0F; 这个是获得checksum的低字节
    c1=((checksum >> 4) & 0x0F); 这个是获得checksum的低字节
    我不懂的是下一段代码,就是那个if语句里转化为ASCII码的意思:c1+= '0';这个是什么意思c1 += 'A' - 10;这个又是什么意思,怎么就转换成ASCII码了?
    帮忙再讲讲啊,小弟先谢谢了!
      

  3.   

    上面这个地方 c1=((checksum >> 4) & 0x0F); 这个是获得checksum的高四位字节了
      

  4.   

    一个0到F的字符转成数字是:
    int HexValue(unsigned char a)
    {
    a -= 48;
    if(a > 9 ) a -= 7;
    return a;
    }//