vc++ CRC16-CCITT循环码验证算法

来源:互联网 发布:约束满足问题 推荐算法 编辑:程序博客网 时间:2024/05/21 06:12


这段时间做串口通信总结的:

方法:先从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];
 将十进制整数转化为十六进制数:TenToHex(dat, datatmp)函数的实现(假设dat只有两个字节大小):
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程序:

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;}

 

原创粉丝点击