什么是CRC16

CRC即循环冗余校验码(Cyclic Redundancy Check)也称为计数式码。它是一种数据传输检错功能,对数据进行校验式计算,把得到的结果附在帧的后面,接收设备也执行类似的算法,进一步可以保证在软件层次上数据传输的正确性和完整性。

在这里插入图片描述
在这里插入图片描述

MATLAB代码

function [crc, hex] = crc16(packet,poly)
% Calculates CRC16/XModem for packet
% Input: byte content in an array
% https://www.lammertbies.nl/comm/info/crc-calculation
% J. Chen. Feb, 2020

crc = 0;
% crc = hex2dec('FFFF');   % for 0xFFFF version
for i = 1:length(packet)
    crc = bitxor( crc, bitshift(packet(i),8) );
    for bit = 1:8
        if bitand( crc, hex2dec('8000') )     % if MSB=1
          crc = bitxor( bitshift(crc,1), hex2dec(poly) );
        else
          crc = bitshift(crc,1);
        end
        crc = bitand( crc, hex2dec('ffff') );  % trim to 16 bits
    end
end
hex = dec2hex(crc);
A = "12 12 83 5F 00 71 03 00 00 C8 92 8B D0 0D 00 00 00 00 03 66 00 B1 FF 00 " + ...
    "00 00 00 00 00 01 00 00 00 00 00 00 00 00 00 00 00 00 00 12 00 D2 03 0D 00 " + ...
    "D2 03 00 00 00 00 00 00 C4 09 00 00 00 00 00 00 C4 09 00 00 00 00 00 00 00 00 " + ...
    "01 18 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 " + ...
    "00 00 00 00 00 00 00 57 63 5C 63 00 00 12 00 17 09 00 0D 7A D4 03 32 00 00 00 00 00 " + ...
    "00 00 00 32 13 00 00 00 EC FF 00 00 10 00 00 1A 00 00 00 19 00 00 00 00 00 00 00 00 C8 " + ...
    "00 00 58 6D 00 00 00 00 00 00 00 00 00 00 79 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 " + ...
    "00 00 00 00 00 00 00 00 00 00 00 00 71 03 00 00";

PACK = regexp(A,'\s+','split');
[crc, hex] = crc16(hex2dec(PACK),'1021');

测试结果:
crc : 25641
hex : ‘6429’

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐