// 生成modbus CRC16数据
CRC- / MODBUS : )CRC寄存器初始值为 FFFF;即16个字节全为1; )CRC- / MODBUS的多项式A001H ( 0001B) ‘H’表示16进制数,‘B’表示二进制数 计算步骤为:
().预置 位寄存器为十六进制 FFFF(即全为 ) ,称此寄存器为 CRC 寄存器;
().把第一个 位数据与 位 CRC 寄存器的低位相异或,把结果放于 CRC 寄
存器; ().检测相异或后的CRC寄存器的最低位,若最低位为1:CRC寄存器先右移1位,再与多项式A001H进行异或;若为0,则CRC寄存器右移1位,无需与多项式进行异或。 ().重复步骤 ,直到右移 次,这样整个 位数据全部进行了处理;
().重复步骤 到步骤4,进行下一个 位数据的处理;
().最后得到的 CRC 寄存器即为 CRC 码。 附参考: 数据(进制): CRC校验:F7 DB 附C语言实现代码: #include <stdio.h> int main(void)
{
unsigned short tmp = 0xffff;
unsigned short ret1 = 0;
unsigned char buff[6] = {0};
buff[] = 0x01;
buff[] = 0x03;
buff[] = 0x61;
buff[] = 0x00;
buff[] = 0x00;
buff[] = 0x02; for(int n = ; n < ; 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 >> ;
ret1 = ret1 | (tmp << );
printf("ret: %X\n",ret1);
return ;
}
输出结果: 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:= ; ssrc:= Trim(ssrc);
ssrc:= StringReplace(sSrc,' ','',[rfReplaceAll]);
ilen:= length(ssrc); SetLength(buff,ilen div );
i:=;
while i<ilen do
begin
buff[(i-)div ]:= StrToInt('$'+sSrc[i]+sSrc[i+]);
i:=i+;
end; for n := to Length(buff)- do //*此处的6 -- 要校验的位数为6个*/
begin
tmp:= buff[n] xor tmp;
for I := to do //*此处的8 -- 指每一个char类型又8bit,每bit都要处理*/
begin
if(tmp and $)<> then
begin
tmp:= tmp shr ;
tmp:= tmp xor $A001;
end
else
begin
tmp:= tmp shr ;
end;
end;
end; ret1 := tmp shr ; //*将CRC校验的高低位对换位置*/
ret1 := ret1 or (tmp shl );
Result:= IntToHex(ret1,); //返回16进制串 用 空格 分开 crc 暂定 2字节
result:= Result[]+Result[]+' '+Result[]+Result[];
end;
// 生成modbus CRC16数据的更多相关文章
- JavaScript 解析 Django Python 生成的 datetime 数据 时区问题解决
JavaScript 解析 Django/Python 生成的 datetime 数据 当Web后台使用Django时,后台生成的时间数据类型就是Python类型的. 项目需要将几个时间存储到数据库中 ...
- T-SQL Recipes之生成动态列表数据
Problem 首先什么是动态列表?举个示例,假设你想输出以逗号分隔的IDs,如: 1,45,67,199,298 Solution 生成动态列表数据在我们生活场景中很常见,比如在 Dynamic P ...
- 【转】Visual Studio 2010在数据库生成随机测数据
测试在项目中是很重要的一个环节,在Visual Studio 2010中,在测试方面已经有很好的支持了,比如有单元测试,负载测试等等.在数据测试的方面,Visual Studio 2010,还支持对数 ...
- 利用Java随机,生成随机学生数据
为模拟向数据库中大量插入学生数据(注:此处应该用PreparedStatement.batchUpdate等批处理提高效率)的情形,通过Java随机来生成学生数据. 一.要生成的学生数据 studen ...
- modbus tcp数据报文结构
modbus tcp数据报文结构 请求:00 00 00 00 00 06 09 03 00 00 00 01 响应:00 00 00 00 00 05 09 03 02 12 34 一次modbus ...
- 对抗生成网络-图像卷积-mnist数据生成(代码) 1.tf.layers.conv2d(卷积操作) 2.tf.layers.conv2d_transpose(反卷积操作) 3.tf.layers.batch_normalize(归一化操作) 4.tf.maximum(用于lrelu) 5.tf.train_variable(训练中所有参数) 6.np.random.uniform(生成正态数据
1. tf.layers.conv2d(input, filter, kernel_size, stride, padding) # 进行卷积操作 参数说明:input输入数据, filter特征图的 ...
- [Oracle]快速生成大量模拟数据的方法
快速生成大量模拟数据的方法: create table TEST(id integer, TEST_NUMBER NUMBER(18,6)); insert into TEST select i+j, ...
- 快速生成100W条数据
快速生成100W条数据,生成的时候是顺序生成,取的时候是随机取用,生成100W条数据大概一分多钟,比网上其他代码速度要快很多 )) --truncate table tb --select top 1 ...
- JS随机生成不重复数据的代码分享
JS随机生成不重复数据. 代码如下: <script> // 定义存放生成随机数的数组 var array=new Array(); // 循环N次生成随机数 for(var i = 0 ...
随机推荐
- Python基础笔记:使用dict和set
dict 就和 C语言中的 map 的作用一样.查找非常快,以空间换时间! dict的使用: >>> d={'Mike':66,'Bob':77,'John':88} #定义一个di ...
- 计算方法执行完的耗时 c#
Stopwatch watch = Stopwatch.StartNew(); //要执行的方法 test(); watch.Stop(); Console.WriteLine(string.Form ...
- 经典SQL50句
50个常用的sql语句 Student(S#,Sname,Sage,Ssex) 学生表 Course(C#,Cname,T#) 课程表 SC(S#,C#,score) 成绩表 Teacher(T#,T ...
- torch.cuda.FloatTensor
Pytorch中的tensor又包括CPU上的数据类型和GPU上的数据类型,一般GPU上的Tensor是CPU上的Tensor加cuda()函数得到. 一般系统默认是torch.FloatTensor ...
- Bean XML 配置(1)- 通过XML配置加载Bean
系列教程 Spring 框架介绍 Spring 框架模块 Spring开发环境搭建(Eclipse) 创建一个简单的Spring应用 Spring 控制反转容器(Inversion of Contro ...
- ACM-Checker Challenge
题目描述:Checker Challenge 1000(ms) 10000(kb) 20 / 90 Examine the 6x6 checkerboard below and note tha ...
- 前端第三篇---前端基础之JavaScript
前端第三篇---前端基础之JavaScript 一.JavaScript概述 二.JavaScript的基础 三.词法分析 四.JavaScript的内置对象和方法 五.BOM对象 六.DOM对象 七 ...
- Arduino - -- 串口双向通信
需要用到Arduino UNO的串口双向通信功能,以下源码: int val; void setup() { Serial.begin(9600); // opensserial port, se ...
- swift中block的使用
在OC中习惯用block来传值,而swift中,block被重新定义了一下,叫闭包: 使用的技巧:谁定义谁传值: 案例使用A.B控制器: 1~4步在B中执行,最后在A中执行: - B控制器: 1- ...
- CMD命令实现数字雨
首先,我们在桌面上先创建一个“.bat”格式的文件,文件名为“数字雨.bat”,创建好了之后右键点击编辑. 在其中输入: @echo off title 数字雨 color 0a setlocal E ...