串口通信中如何对数据进行异或校验
程序的功能是做一个串口调试的程序;
首先在一个编辑框中可以输入字符也就是1112AABB类似的字符,然后将这些数据转换为16进制的,我是通过以下这个函数的
int CComTestDlg::String2Hex(CString str, CByteArray &senddata)
{
int hexdata,lowhexdata;
int hexdatalen=0;
int len=str.GetLength();
// CString str;
senddata.SetSize(len/2);
for(int i=0;i<len;)
{
char lstr,hstr=str[i];
if(hstr==' ')
{
i++;
continue;
}
i++;
if(i>=len)
break;
lstr=str[i];
hexdata=ConvertHexChar(hstr);
lowhexdata=ConvertHexChar(lstr);
if((hexdata==16)||(lowhexdata==16))
break;
else
hexdata=hexdata*16+lowhexdata;
i++;
senddata[hexdatalen]=(char)hexdata;
hexdatalen++;
}
senddata.SetSize(hexdatalen);
return hexdatalen;
}
char CComTestDlg::ConvertHexChar(char ch)
{
if((ch>='0')&&(ch<='9'))
return ch-0x30;
else if((ch>='A')&&(ch<='F'))
return ch-'A'+10;
else if((ch>='a')&&(ch<='f'))
return ch-'a'+10;
else return (-1);
}
然后把这些数据全部都放在了一个CByteArray 的一个变量里面,我想求出这些数据的异或校验值,如何来求取呢!
比如说我通过
CString CComTestDlg::BytetoCString(CByteArray &Bytedata)
{
int i;
int length;
unsigned long ls=0;
length=Bytedata.GetSize();
for (i = 0; i < length; i++)
{
ls^=(long)Bytedata.GetAt(i);
}
unsigned char ch;
if(ls==0)
{
ch=NULL;
}
else{
ch = ls;
}
return ch;
}
虽然许多数据都可以进行异或校验,但是当我们输入的数据为0101aa,010181,都是不能产生校验值!请问大侠们如何解决这个问题啊!