CRC16-Modbus—MATLAB

最近在用matlab控制IAI电缸,涉及CRC16—modbus通讯协议,找了很多资源也翻墙去解决,最后在博文的基础上修改得以解决。针对IAI电缸的控制涉及“从站地址功能码等”。:[原博文](https://blog.csdn.net/seastarme/article/details/85180871?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522159774927219195264561580%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=159774927219195264561580&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2allfirst_rank_ecpm_v3~pc_rank_v3-2-85180871.pc_ecpm_v3_pc_rank_v3&utm_term=CRC16modbus%20MATLAB&spm=1018.2118.3001.4187)

实现的校验码如下图:
在这里插入图片描述
在原来博文的基础上,直接键入从站地址的16进制字符,方便大家理解,后面可以换成改变数据字符,就可以实现matlab对电缸的位置控制。
代码见压缩包

function crc = crc_modbus(frame)
%%
% frame由Slave Adress. Function Code以及Data组成,格式为[xx;xx;xx;...]% xx由十六进制表示,含2个字节。
% 输出格式: crc = [CRC Lo; CRC Hi], [xx; xx]%%初始化
 frame=[hex2dec('01'),hex2dec('05'),hex2dec('04'),hex2dec('14'),hex2dec('FF'),hex2dec('00')];
frame_dec = frame;
frame_bin = dec2bin(frame_dec, 16); % 将十六进制转变为二进制
initial_crc = uint8(ones(1, 16)); % CRC初始值0xFFFF
op_crc = uint8([1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1]);% 0xA001,用于异或运算
%% 利用for循环计算二进制表示的CRC
 n = numel(frame);
for i = 1:n
    frame_bin_element = frame_bin(i, :);
    frame_bin_element =  frame_bin_element';
    frame_bin_element_dec = bin2dec(frame_bin_element);
    frame_bin_element_dec = frame_bin_element_dec';
    frame_crc =  uint8(frame_bin_element_dec);
    if i == 1
        crc = bitxor(initial_crc, frame_crc);
    else
        crc = bitxor (crc, frame_crc);
    end
    LSB = crc(16);
    for j = 1:8
        crc = [uint8(0), crc(1:15)];
        if LSB == 1
            crc = bitxor(crc, op_crc);
        end
        LSB = crc(16);
    end
end
%% 将二进制CRC转变为十六进制
crc_bin = dec2bin(crc);
crc_dec = bin2dec(crc_bin');
crc = dec2hex(crc_dec , 4);
crc = [crc(3:4);crc(1:2)]; % [CRC Lo; CRC Hi]
end
  • 6
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值