「MATLAB」计算CRC16可配置配置公式
·
什么是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’
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐

所有评论(0)