CRC16校验的学习

来源:互联网 发布:linux 复制粘贴命令 编辑:程序博客网 时间:2024/06/06 03:32

一般一些工业上仪器仪表都会选择CRC16校验,而写程序对帧数据的校验也需要选择CRC16校验看看对不对。所以选择CRC16校验还是很有必要的。

这里写图片描述

1、51的CRC16校验

/*** @brief  计算CRC* @param  *modbusdata:数据指针* @param  length:数据长度* @param  * @retval 计算的CRC值* @example **/unsigned int crc16_modbus(unsigned char *modbusdata, char length){    char i, j;    unsigned int crc = 0xffff;//有的用ffff有的用0    for (i = 0; i < length; i++)    {        crc ^= modbusdata[i];        for (j = 0; j < 8; j++)        {                if ((crc & 0x01) == 1)                {                    crc = (crc >> 1) ^ 0xa001;                }                else                {                    crc >>= 1;                }        }    }    return crc;}

2、LUA的CRC16校验

function CRC16(modbusdata, length)    local i=0; local j=0; local crc=0; local k=1; local k=1; local l=1;    for k=1, length then        crc = bit.bxor(crc, modbusdata[k])        for l=1, 8 do            if bit.band(crc, 1) == 1 then                crc = bit.rshift(crc, 1)                crc = bit.bxor(crc, 0xa001)            else                crc = bit.rshift(crc, 1)            end        end    end    return crcend

3、C#上位机的CRC16校验

private int crc16_modbus(byte[] modbusdata, int length){    int i,j;    int crc = 0;    try    {        for(i=0; i<length; i++)        {            crc^=modbusdata[i];            for(j=0; i<8; j++)            {                if(crc & 0x01 == 1)                {                    crc = (crc >> 1) ^ 0xa001;                }                else                {                    crc >>= 1;                }            }        }    }    catch(Exception)    {        throw;    }    return crc;}

当然CRC是2字节的,具体存储方式大端存储还是小端存储,不同机器不一样。CRC的初值也可能不一样有的是0x0000,而有的又却是0xFFFF.

具体怎么选还有根据实际应用环境,进行合理的测试取舍。

原创粉丝点击