// 生成modbus CRC16数据
时间:2020-01-07
本文章向大家介绍// 生成modbus CRC16数据,主要包括// 生成modbus CRC16数据使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
CRC-16 / MODBUS : 1)CRC寄存器初始值为 FFFF;即16个字节全为1; 2)CRC-16 / MODBUS的多项式A001H (1010 0000 0000 0001B) ‘H’表示16进制数,‘B’表示二进制数 计算步骤为: (1).预置 16 位寄存器为十六进制 FFFF(即全为 1) ,称此寄存器为 CRC 寄存器; (2).把第一个 8 位数据与 16 位 CRC 寄存器的低位相异或,把结果放于 CRC 寄 存器; (3).检测相异或后的CRC寄存器的最低位,若最低位为1:CRC寄存器先右移1位,再与多项式A001H进行异或;若为0,则CRC寄存器右移1位,无需与多项式进行异或。 (4).重复步骤 3 ,直到右移 8 次,这样整个 8 位数据全部进行了处理; (5).重复步骤 2 到步骤4,进行下一个 8 位数据的处理; (6).最后得到的 CRC 寄存器即为 CRC 码。 附参考: 数据(16进制):01 03 61 00 00 02 CRC校验:F7 DB 附C语言实现代码: #include <stdio.h> int main(void) { unsigned short tmp = 0xffff; unsigned short ret1 = 0; unsigned char buff[6] = {0}; buff[0] = 0x01; buff[1] = 0x03; buff[2] = 0x61; buff[3] = 0x00; buff[4] = 0x00; buff[5] = 0x02; for(int n = 0; n < 6; n++){/*此处的6 -- 要校验的位数为6个*/ tmp = buff[n] ^ tmp; for(int i = 0;i < 8;i++){ /*此处的8 -- 指每一个char类型又8bit,每bit都要处理*/ if(tmp & 0x01){ tmp = tmp >> 1; tmp = tmp ^ 0xa001; } else{ tmp = tmp >> 1; } } } /*CRC校验后的值*/ printf("%X\n",tmp); /*将CRC校验的高低位对换位置*/ ret1 = tmp >> 8; ret1 = ret1 | (tmp << 8); printf("ret: %X\n",ret1); return 0; } 输出结果: F7DB ret: DBF7 // 生成modbus CRC16数据 function CRC16(sSrc:shortstring):shortstring; var tmp: word; ret1: word; buff: array of byte; n:integer; i:integer; ilen:Integer; //ssrc length begin if trim(ssrc)='' then exit; tmp:= $FFFF; ret1:= 0; ssrc:= Trim(ssrc); ssrc:= StringReplace(sSrc,' ','',[rfReplaceAll]); ilen:= length(ssrc); SetLength(buff,ilen div 2); i:=1; while i<ilen do begin buff[(i-1)div 2]:= StrToInt('$'+sSrc[i]+sSrc[i+1]); i:=i+2; end; for n := 0 to Length(buff)-1 do //*此处的6 -- 要校验的位数为6个*/ begin tmp:= buff[n] xor tmp; for I := 0 to 7 do //*此处的8 -- 指每一个char类型又8bit,每bit都要处理*/ begin if(tmp and $01)<>0 then begin tmp:= tmp shr 1; tmp:= tmp xor $A001; end else begin tmp:= tmp shr 1; end; end; end; ret1 := tmp shr 8; //*将CRC校验的高低位对换位置*/ ret1 := ret1 or (tmp shl 8); Result:= IntToHex(ret1,4); //返回16进制串 用 空格 分开 crc 暂定 2字节 result:= Result[1]+Result[2]+' '+Result[3]+Result[4]; end;
原文地址:https://www.cnblogs.com/tobetterlife/p/12161832.html
- 使用Identity Server 4建立Authorization Server (1)
- Java之异常处理
- 挖洞经验 | 看我如何利用SAML漏洞实现Uber内部聊天系统未授权登录
- 使用ichartjs生成图表
- 使用angular4和asp.net core 2 web api做个练习项目(四)
- list.add(),向List集合插入对象报空指针异常
- 使用angular4和asp.net core 2 web api做个练习项目(三)
- 即学即用系列一:纯函数
- Java之StringBuffer,StringBuilder,Math,Date,SimpleDateFormat,UUID,File
- React编程思想
- 前台分页,以及类别选择
- 使用angular4和asp.net core 2 web api做个练习项目(二), 这部分都是angular
- 数据库 105道题目整理与吐血总结
- 使用angular4和asp.net core 2 web api做个练习项目(一)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法