vc++ CRC16-CCITT循环码验证算法
这段时间做串口通信总结的:
方法:先从EditBox读取十进制字符串数据,转化为十进制整数,再进行 CRC16-CCITT循环码验证算法,求的CRC值,再转化为十六进制数发送到串口。
代码:
UpdateData(TRUE);//更新,读取数据
int lenchar=17;
int dat;
char *DataSend=(char *)calloc(lenchar, sizeof(char));//要发送的数据
DataSend[0]=0x2;
DataSend[1]=0x11;
DataSend[2]=0x22;
int *datatmp=(int *)calloc(6, sizeof(int));
dat=atoi(m_EditZ2);//转换EidtBox中的十进制字符串为十进制整数
TenToHex(dat, datatmp);//将十进制整数转化为十六进制数
DataSend[3]=datatmp[4];
DataSend[4]=datatmp[5];
dat=atoi(m_EditZx);
TenToHex(dat, datatmp);
DataSend[5]=datatmp[4];
DataSend[6]=datatmp[5];
dat=atoi(m_EditC2);
TenToHex(dat, datatmp);
DataSend[7]=datatmp[4];
DataSend[8]=datatmp[5];
dat=atoi(m_EditS2);
TenToHex(dat, datatmp);
DataSend[9]=datatmp[4];
DataSend[10]=datatmp[5];
dat=atoi(m_EditZy);
TenToHex(dat, datatmp);
DataSend[11]=datatmp[4];
DataSend[12]=datatmp[5];
dat=atoi(m_EditZ0);
TenToHex(dat, datatmp);
DataSend[13]=datatmp[4];
DataSend[14]=datatmp[5];
dat=CRCCCITT(lenchar, DataSend);//求CRCCCITT循环码
////若循环码为负值,则需要做一下处理,这是我猜出来的,但是经过验证,结果确实对的。知其然而不知其所以然!!!
if (dat<0)
{
dat=abs(dat)-1;
}
TenToHex(dat, datatmp);
DataSend[15]=datatmp[5];//此时与上面的不同
DataSend[16]=datatmp[4];
<span style="BACKGROUND-COLOR: #33ff33"> 将十进制整数转化为十六进制数:TenToHex(dat, datatmp)函数的实现(假设dat只有两个字节大小):</span>
void CDialog2::TenToHex(int c, int *b)
{
for (int i=0; i<6; i++)
{
b[i]=0;
}
int n,k=1,j;
int i=0;
if(c<256)
{
b[4]=0;
b[5]=c;
}
else
{
b[0]=c%16;
c=c/16;
while(c>16)
{
b[k]=c%16;
k++;
c=c/16;
}
b[k]=c;
b[4]=b[3]*16+b[2];
b[5]=b[1]*16+b[0];
}
}
求CRCCCITT循环码:
int CDialog2::CRCCCITT(int lenchar, char *data)
{
int len,CRC=0;
len=lenchar-2;
int poly =0x8408;
for (int i=0; i<len; i++)
{
CRC=CRC^data[i];
for (int j=0; j<8; j++)
{
if ((CRC&0x0001)!=0)
{
CRC>>=1;
CRC=CRC^poly;
}
else
{
CRC>>=1;
}
}
}
return CRC;
}
独立的求CRC-CCITT程序: www.zzzyk.com
int CRCCCITT(int len, char *data)
{
int CRC=0;
int poly =0x8408;
for (int i=0; i<len; i++)
{
CRC=CRC^data[i];
for (int j=0; j<8; j++)
{
if ((CRC&0x0001)!=0)
{
CRC>>=1;
CRC=CRC^poly;
}
else
{
CRC>>=1;
}
}
}
return CRC;
}
摘自 myj0513的专栏
补充:软件开发 , Vc ,