异或交验算法
通过本段程序将通过异或校验算法,对给定的字符串进行获取交验值,并根据一般的数据打包方法把数据加上包头、包尾、交验值和回车换行符,成为数据发送包。
- /*--------------------------------------------------------------------------------------
- *程序功能:将字符串按照NMEA-0183无线通信协议格式打包函数
- *执行条件:通过函数调用
- *执行结果:将给定的字符串参数经过异或校验后打包发送
- *--------------------------------------------------------------------------------------*/
- voidCSerialPortTestDlg::SendNMEAData(CString&strData)
- {
- charchecksum=0,cr=13,ln=10;
- charch,cl;//校验位的高四位和第四位;
- //例如:校验值为5D,则ch='5';cl='D';
- for(inti=0;i<strData.GetLength();i++)
- {
- checksum=checksum^strData[i];//进行异或交验取值
- }
- /*--------------------------------------------------------------------------------------
- *功能:(下列代码)为了取得的异或值能够显示为字符
- *过程:先将异或后的一个字节,高四位和第四位分开,根据
- *对应的16进制数,显示出其字符。例如0000,对应16进制的0,
- *将会显示字符‘0’,即ASCII的第30个字符,1011对应16进制的B
- *将会显示字符‘B’,即ASCII的第65个字符(‘A’后面那个,所
- *以计算方法是‘A’+1)
- *--------------------------------------------------------------------------------------*/
- ch=(checksum>>4)&0x0F;//取高位数;
- cl=checksum&0x0F;//取低位数;
- if(ch<10));//低于10的数
- ch=ch+'0';
- else
- ch=(ch-10)+'A';);//不低于10的16进制数,如:A、B、C、D、E、F
- if(cl<10)
- cl=cl+'0';
- else
- cl=(cl-10)+'A';
- CStringstrNMEAData;
- //加上包头、包尾、校验值和回车、换行符,形成数据包
- strNMEAData='$'+strData+'*'+ch+cl+cr+ln;
- m_SerialPort.WriteToPort((LPCTSTR)strNMEAData);//将数据包发送
- m_strEditSendMessage.Format("发送数据包:%s",strNMEAData);//显示数据包
- UpdateData(FALSE);
- }