设为首页 加入收藏

TOP

vc++ CRC16-CCITT循环码验证算法
2014-11-23 20:26:45 】 浏览:416
Tags: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];

将十进制整数转化为十六进制数: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 {

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.2cto.com


int CRCCCITT(int len, char *data)
{
int CRC=0;
int poly =0x8408;
for (int i=0; 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的专栏

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇如何用vc6编译ffmpeg, 并单步调试.. 下一篇VC中添加Dialogbar

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目