c语言crc
Ⅰ crc16校验的c语言程序
unsigned short crc_dsp(unsigned short reg, unsigned char data_crc)
//reg为crc寄存器, data_crc为将要处理的8bit数据流
{
unsigned short msb; //crc寄存器将移出的最高1bit
unsigned short data;
unsigned short gx = 0x8005, i = 0; //i为左移次数, gx为生成多项式
data = (unsigned short)data_crc;
data = data << 8;
reg = reg ^ data;
do
{
msb = reg & 0x8000;
reg = reg << 1;
if(msb == 0x8000)
{
reg = reg ^ gx;
}
i++;
}
while(i < 8);
return (reg);
}
Ⅱ 单片机 用c语言编写 modbus rtu 通讯怎么写啊 主要是crc 校验部分不知道怎么写 怎么把一窜字符进行CRC计算
我刚刚写好.跟PLC连接测试过,可以的.
/***************************************************************
CRC计算方法
1.预置1个16位的寄存器为十六进制FFFF(即全为1);称此寄存器为CRC寄存器;
2.把第一个8位二进制数据(既通讯信息帧的第一个字节)与16位的CRC寄存器的低
8位相异或,把结果放于CRC寄存器;
3.把CRC寄存器的内容右移一位(朝低位)用0填补最高位,并检查右移后的移出位;
4.如果移出位为0:重复第3步(再次右移一位);
如果移出位为1:CRC寄存器与多项式A001(1010 0000 0000 0001)进行异或;
5.重复步骤3和4,直到右移8次,这样整个8位数据全部进行了处理;
6.重复步骤2到步骤5,进行通讯信息帧下一个字节的处理;
7.将该通讯信息帧所有字节按上述步骤计算完成后,得到的16位CRC;
*****************************************************************/
/****************************************************************************
名称: UART_CRC16_Work()
说明: CRC16校验程序
参数: *CRC_Buf:数据地址
CRC_Leni:数据长度
返回: CRC_Sumx:校验值
*****************************************************************************/
unsigned int UART_CRC16_Work(unsigned char *CRC_Buf,unsigned char CRC_Leni)
{
unsigned char i,j;
unsigned int CRC_Sumx;
CRC_Sumx=0xFFFF;
for(i=0;i<CRC_Leni;i++)
{
CRC_Sumx^=*(CRC_Buf+i);//异或
for(j=0;j<8;j++)
{
if(CRC_Sumx & 0x01)
{
CRC_Sumx>>=1;
CRC_Sumx^=0xA001;
}
else
{
CRC_Sumx>>=1;
}
}
}
return (CRC_Sumx);
}
Ⅲ C语言 编写一个程序 求输入一个数计算它的CRC值,
unsignedintcrc(unsignedchar*buf,unsignedcharlen)
{
chari;
unsignedintc_dat=0xffff;//有的CRC校验这个值是0
for(;len>0;len--)//
{
c_dat^=*buf;
for(i=0;i<8;i++)
{
if((c_dat&0x1)==0x1)
{
c_dat>>=1;
c_dat^=0xa001;
}
else
{
c_dat>>=1;
}
}
buf++;
}
returnc_dat;
}