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循环计算二进制表示的CRCn = numel(frame);
for i = 1:nframe_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 == 1crc = bitxor(initial_crc, frame_crc);elsecrc = bitxor (crc, frame_crc);endLSB = crc(16);for j = 1:8crc = [uint8(0), crc(1:15)];if LSB == 1crc = bitxor(crc, op_crc);endLSB = 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
CRC16-Modbus—MATLAB相关推荐
- Java语言 CRC-16/MODBUS..16+x15+x2+1校验码生成
CRC算法名称 多项式公式 宽度 多项式 初始值 结果异或值 输入值反转 输出值反转 CRC-16/MODBUS 16+x15+x2+1 16 8005 FFFF 0000 true true 查表法 ...
- CRC-16/MODBUS x16+x15+x2+1校验计算 C++
CRC-16/MODBUS x16+x15+x2+1校验计算 #include <stdio.h> int main(void) { unsigned short tmp = 0x ...
- CRC-16 Modbus代码
CRC(循环冗余校验)在线计算 /* 二进制显示无符号int函数,number:十进制整数 */ unsigned int IntegerToBinary(unsigned int number){c ...
- C++与JAVA代码实现CRC-16/MODBUS算法,且与 http://www.ip33.com/crc.html 进行结果验证
CRC-16/MODBUS的多项式为:x16+x15+x2+1(8005),宽度为16.运算时,首先将一个16位的寄存器预置为11111111 11111111,然后连续把数据帧中的每个字节中的8位与 ...
- Verilog --crc16 modbus
Verilog --crc16 modbus 1 .CRC 校验原理 CRC 的基本原理就是在一个 n 位二进制数据序列之后附加一个 r 位二进制检验码序列,从而构成一个总长为 p = n + r 位 ...
- 16进制(CRC16)(MODBUS RTU通讯)校验码在线计算器
最近在项目上遇到,用485协议命令控制灯光继电器的开关需要计算16进制(CRC16)(MODBUS RTU通讯)校验码来写控制命令,这种在网上有现成的计算器,我们直接使用即可,以下为我用的一个计算器的 ...
- CRC16 Modbus计算原理与代码实现
1.CRC16 Modbus计算原理 1) 预置 1 个 16 位的寄存器为十六进制FFFF(即全为 1) , 称此寄存器为 CRC寄存器. 2) 把第一个 8 位二进制数据 (通信信息帧的第一个字节 ...
- CRC-16 / MODBUS 校验计算方法
CRC-16 / MODBUS : 1)CRC寄存器初始值为 FFFF:即16个字节全为1: 2)CRC-16 / MODBUS的多项式A001H (1010 0000 0000 0001B) 'H' ...
- 一文详解循环冗余校验校验算法(CRC校验)及C语言代码的实现 ---- 以CRC-16/MODBUS为例讲解
一.概述 现在的产品开发过程中,无论是数据的储存还是传输,都需要确保数据的准确性,所以就需要在数据帧后面附加一串校验码,方便接收方使用校验码校验接收到的数据是否是正确的. 常用的校验方式有奇偶校验.异 ...
- crc java_java实现CRC16 MODBUS校验算法
/*** 查表法计算CRC16校验 * *@paramdata 需要计算的字节数组*/ public static String getCRC3(byte[] data) {byte[] crc16_ ...
最新文章
- 有哪些好用的企业目标管理和任务协作软件?
- javascript——三元操作符
- 在Java中使用final关键字可以提高性能吗?
- MPLS TE基本配置-IS-IS
- OpenCV阈值范围Threshold inRange的实例(附完整代码)
- 还在对Matplotlib繁琐的图层设置感到烦恼!?快来看看这个Python绘图工具包吧
- 虚函数(Virtual Function)与 纯虚函数(Pure Virtual Function)
- [转] 微软轻量级 Web 开发平台 WebMatrix 发布
- 小米自然语言处理工程师招聘条件与自己的对应整理
- DTW算法(语音识别)
- Unity3D卡牌手游《X三国》源码前后端完整下载安卓+IOS双端
- matlab 太阳角,matlab – 来自太阳位置和观察者位置的时间
- Allatori:代码混淆器的使用
- STC12系列单片机的AUXR辅助寄存器
- 方案系列--多个应用同时接入Google和Facebook三方登陆互联互通解决方案
- 【前端学习】前端学习第十三天:JavaScript中DOM技术介绍
- 我们该如何高效的学习
- 树莓派输出pwm波c语言,02树莓派4B—C语言编程——PWM
- Java基础:Java八大基本数据类型
- 网页中打开qq聊天框