Mudbus协议CRC校验码C#

news2024/11/24 12:47:25

Mudbus协议CRC校验码C#

  • 什么是modbus
  • 协议特点
  • 协议格式
  • modbus-crc16校验原理方法
    • 帧校验
    • CRC计算方法:
    • 例子
  • C#代码
  • Demo源码下载

在这里插入图片描述

什么是modbus

Modbus是一种串行通信协议,最初由Modicon(目前属于施耐德电气公司)于1979年开发
Modbus协议是应用在Modicon产品上的,后来才被移植到其他产品上
Modbus协议的通信接口可以有多种选择,如RS232、RS485、以太网等

协议特点

支持主从方式,即主站、从站
Modbus协议主要分为两种格式,即Modbus RTU和Modbus ASCII,Modbus RTU使用二进制格 式传输数据,而Modbus ASCII则将数据以ASCII码形式进行传输。此外,Modbus还可以通过TCP/IP协议进行网络通信,称为Modbus TCP/IP。

协议格式

  1. 起始地址(也就是常说的站号)
  2. 功能码 (01,03,06,10,16等等)
  3. 数据内容
  4. 校验码(CRC16校验)

modbus-crc16校验原理方法

帧校验

在ModbusRTU和Modbus ASCII多数用的是帧校验,帧校验有两种,一种是ModbusRTU采用的CRC(循环冗余校验),另一种是Modbus ASCII采用的LRC( 纵向冗余校验),这两种校验方式具体内容我们不再赘述,现在主要谈ModbusRTU通信协议的CRC校验的具体实现代码。ModbusRTU通讯数据(信息帧)的格式为:从站地址码(1byte)+功能码(1byte)+数据区(N bytes)+CRC校验码(2 bytes)。CRC寄存器为16位,它是经过CRC运算,然后高低位进行交换形成的。

CRC计算方法:

1.预置1个16位的寄存器为十六进制FFFF(即全为1);称此寄存器为CRC寄存器;
2.把第一个8位二进制数据(既通讯信息帧的第一个字节)与16位的CRC寄存器的低8位相异或,把结果放于CRC寄存器;
3.把CRC寄存器的内容右移一位(朝低位)用0填补最高位,并检查右移后的移出位;
4.如果移出位为0:重复第3步(再次右移一位);如果移出位为1:CRC寄存器与多项式A001(1010 0000 0000 0001)进行异或;
5.重复步骤3和4,直到右移8次,这样整个8位数据全部进行了处理;
 6.重复步骤2到步骤5,进行通讯信息帧下一个字节的处理;  
 7.将该通讯信息帧所有字节按上述步骤计算完成后,得到的16位CRC寄存器的高、低字节进行交换;

例子

//下面是5行示例crc16数据,前6个字节数据,后两个字节crc结果。
//F9 0C C2 36 13 2A 55 2A
// F9 0C C2 35 13 32 A5 20
//F9 0C C2 61 13 3A E5 36
//F9 0C C2 62 13 02 14 E4
// F9 0C C2 39 13 0A 64 F1

C#代码

/// <summary>
/// CRC校验,参数data为byte数组
///  CRC计算方法:
//1.预置1个16位的寄存器为十六进制FFFF(即全为1); 称此寄存器为CRC寄存器;
//2.把第一个8位二进制数据(既通讯信息帧的第一个字节)与16位的CRC寄存器的低8位相异或,把结果放于CRC寄存器;
//3.把CRC寄存器的内容右移一位(朝低位)用0填补最高位,并检查右移后的移出位;
//4.如果移出位为0:重复第3步(再次右移一位); 如果移出位为1:CRC寄存器与多项式A001(1010 0000 0000 0001)进行异或;
//5.重复步骤3和4,直到右移8次,这样整个8位数据全部进行了处理;
//6.重复步骤2到步骤5,进行通讯信息帧下一个字节的处理;
//7.将该通讯信息帧所有字节按上述步骤计算完成后,得到的16位CRC寄存器的高、低字节进行交换;
//下面是5行示例crc16数据,前6个字节数据,后两个字节crc结果。
//F9 0C C2 36 13 2A 55 2A
//	F9 0C C2 35 13 32 A5 20
//F9 0C C2 61 13 3A E5 36
//F9 0C C2 62 13 02 14 E4
//	F9 0C C2 39 13 0A 64 F1
/// </summary>
/// <param name="data">校验数据,字节数组</param>
/// <returns>字节0是高8位,字节1是低8位</returns>
public static byte[] CRCCalc(byte[] data)
{
	//1.预置1个16位的寄存器为十六进制FFFF(即全为1); 称此寄存器为CRC寄存器;
	//crc计算赋初始值
	var crc = 0xffff;
	for (var i = 0; i < data.Length; i++)
	{
		//2.把第一个8位二进制数据(既通讯信息帧的第一个字节)与16位的CRC寄存器的低8位相异或,把结果放于CRC寄存器;
		crc = crc ^ data[i]; //将八位数据与crc寄存器异或 ,异或的算法就是,两个二进制数的每一位进行比较,如果相同则为0,不同则为1

		//3.把CRC寄存器的内容右移一位(朝低位)用0填补最高位,并检查右移后的移出位;
		//4.如果移出位为0:重复第3步(再次右移一位); 如果移出位为1:CRC寄存器与多项式A001(1010 0000 0000 0001)进行异或;
		//5.重复步骤3和4,直到右移8次,这样整个8位数据全部进行了处理;
		for (var j = 0; j < 8; j++)
		{
			int temp;
			temp = crc & 1;
			crc = crc >> 1;
			crc = crc & 0x7fff;
			if (temp == 1) crc = crc ^ 0xa001;
			crc = crc & 0xffff;
		}
	}

	//CRC寄存器的高低位进行互换
	var crc16 = new byte[2];
	//CRC寄存器的高8位变成低8位,
	crc16[1] = (byte)((crc >> 8) & 0xff);
	//CRC寄存器的低8位变成高8位
	crc16[0] = (byte)(crc & 0xff);
	return crc16;
}

Demo源码下载

Mudbus协议CRC校验码C#Demo

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1579277.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

设计模式之访问者模式讲解

概念&#xff1a;封装一些作用于某种数据结构中的各元素的操作&#xff0c;它可以在不改变数据结构的前提下定义作用于这些元素的新操作。 抽象访问者&#xff1a;声明一个或多个访问操作&#xff0c;定义访问者可以访问哪些元素。具体访问者&#xff1a;实现抽象访问者的所有操…

2-4 AUTOSAR ASW Port端口

返回总目录->返回总目录<- 一、端口Port 软件组件的端口根据输入/输出方向可分为需型端口(Require Port,RPort)与供型端口(Provide Port,PPort),以及供需端口(Provide and Require Port,PRPort)。 需型端口可以和供型端口连接。 需型端口:用于从其他软件组件获…

多线程原理详解01(程序、进程、线程介绍,线程创建的三种方式(Thread、Runnable、Callable)、三种方式各自实现多线程的具体操作、代码解析)

目录 多线程原理详解01_线程简介多任务多线程程序、进程、线程Process&#xff08;进程&#xff09;与 Thread &#xff08;线程&#xff09;总结&#xff1a; 02_线程创建三种方式&#xff1a;1、继承 Thread 类1-1&#xff1a;通过继承Thread类实现多线程演示代码 1-2&#x…

干货分享 | 在TSMaster中加载基于DotNet平台的SeedKey

在UDS诊断过程中&#xff0c;会涉及到安全访问的问题&#xff0c;也就是所谓的Seed&Key。TSMaster 诊断模块支持通过.dll文件载入 Seed&Key 算法用于安全访问解锁。在最近发布的TSMaster 2024.03版本中不仅支持了C/C&#xff0c;Delphi等语言封装的DLL文件&#xff0c;…

基于GD32的简易数字示波器(3)- PCB设计

这期记录的是项目实战&#xff0c;做一个简易的数字示波器。 教程来源于嘉立创&#xff0c; 本期介绍PCB设计的大致流程。 下图为示波器的指标 具有选择交流耦合还是直流耦合功能、输入信号不衰减或衰减50倍 输入频率理论最大800KHz输入幅值&#xff08;不衰减&#xff09;…

【RISC-V 指令集】RISC-V 向量V扩展指令集介绍(四)- 配置和设置指令(vsetvli/vsetivli/vsetvl)

1. 引言 以下是《riscv-v-spec-1.0.pdf》文档的关键内容&#xff1a; 这是一份关于向量扩展的详细技术文档&#xff0c;内容覆盖了向量指令集的多个关键方面&#xff0c;如向量寄存器状态映射、向量指令格式、向量加载和存储操作、向量内存对齐约束、向量内存一致性模型、向量…

SUSE Linux Enterprise Server安装

1. SUSE镜像下载 下载地址&#xff1a;Evaluation Copy of SUSE Linux Enterprise Server | SUSE 选择自己需要的版本和对应的架构 选择下载SLE-15-SP5-Full-x86_64-GM-Media1.iso&#xff0c;下载时需要注册请按照提示进行注册。 2. 安装SUSE Linux 安装时可以通过连接服务…

MySQL高级(索引结构Hash,为什么InnoDB存储引擎选择使用B+tree索引结构?)

目录 1、Hash索引结构 2、Hash索引特点 3、存储引擎支持 4、为什么InnoDB存储引擎选择使用Btree索引结构&#xff1f; 1、Hash索引结构 哈希索引就是采用一定的hash算法&#xff0c;将键值换算成新的hash值&#xff0c;映射到对应的槽位上&#xff0c;然后存储在hash表中。 如…

希尔排序解读

在算法世界中&#xff0c;排序算法是至关重要的一部分。而希尔排序&#xff08;Shell Sort&#xff09;作为一种基于插入排序的改进算法&#xff0c;通过允许交换非相邻元素&#xff0c;从而在一定程度上提高了排序效率。本文将深入探讨希尔排序的原理、实现方式以及它的性能特…

电商技术揭秘十五:数据挖掘与用户行为分析

相关系列文章 电商技术揭秘一&#xff1a;电商架构设计与核心技术 电商技术揭秘二&#xff1a;电商平台推荐系统的实现与优化 电商技术揭秘三&#xff1a;电商平台的支付与结算系统 电商技术揭秘四&#xff1a;电商平台的物流管理系统 电商技术揭秘五&#xff1a;电商平台…

【3GPP】【核心网】核心网/蜂窝网络重点知识面试题一(超详细)

目录 1. 核心网技术演进、各大运营商采用的技术是什么&#xff1f; 2. 整体掌握lte网络架构&#xff0c;能画出网络拓扑&#xff0c;并指出关键接口的位置 3. 对于主要的LTE核心网网元&#xff0c;讲讲自己对其功能的理解 4. 核心网常用字段概念&#xff1a;imsi、msisdn、…

Python学习从0到1 day21 第二阶段 面向对象 ④ 类型注解

仗剑红尘已是癫&#xff0c;有酒平步上青天 —— 24.4.7 一、变量的类型注解 学习目标 1.理解为什么使用类型注解 2.掌握变量的类型注解语法 为什么使用类型注解 tip&#xff1a;CTRLP&#xff0c;可以提示函数中传入的参数 当我们需要使用pycharm的自动补全功能&#xff0c;又…

论如何在小程序展示超链接在线网页

在工作中遇到一个需求&#xff0c;就是在小程序中展示超链接网页&#xff0c;起初我是直接使用web-view标签 <web-view src"https://www.baidu.com/"/>但是web-view只能在开发阶段手机上展示&#xff0c;一旦小程序发布线上&#xff0c;就会出现下面这种情况“…

Unity类银河恶魔城学习记录12-7-2 p129 Craft UI - part 2源代码

Alex教程每一P的教程原代码加上我自己的理解初步理解写的注释&#xff0c;可供学习Alex教程的人参考 此代码仅为较上一P有所改变的代码 【Unity教程】从0编程制作类银河恶魔城游戏_哔哩哔哩_bilibili UI_CraftWindow.cs using UnityEngine.UI; using TMPro; using UnityEngin…

如何通过跨网软件,实现网络隔离后的文件安全收发摆渡?

随着企业数字化转型的逐步深入&#xff0c;企业投入了大量资源进行信息系统建设&#xff0c;信息化程度日益提升。绝大多数企业为了防止内部核心数据泄露&#xff0c;会实施网络隔离&#xff0c;比如内外网隔离&#xff0c;或者在内部网络中又划分出研发网、办公网、生产网等。…

三、SpringBoot3 整合 SpringMVC

本章概要 实现过程web 相关配置静态资源处理自定义拦截器(SpringMVC 配置) 3.1 实现过程 创建程序引入依赖 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www…

【数据结构与算法】力扣 142. 环形链表 II

题目描述 给定一个链表的头节点 head &#xff0c;返回链表开始入环的第一个节点。 如果链表无环&#xff0c;则返回 null。 如果链表中有某个节点&#xff0c;可以通过连续跟踪 next 指针再次到达&#xff0c;则链表中存在环。 为了表示给定链表中的环&#xff0c;评测系统…

安卓远离手机app

软件介绍 远离手机是专门为防止年轻人上瘾而打造的生活管理类的软件,适度用手机&#xff0c;保护眼睛&#xff0c;节约时间。 下载 安卓远离手机app

Codeforces CROC 2016 - Final Round B. Graph Coloring【2-SAT、二分图染色】

B. Graph Coloring 题意 有 n n n 个节点和 m m m 条边&#xff0c;起初每条边都有具有颜色 0 0 0 或 1 1 1 其中一种&#xff0c;可以选择一个节点&#xff0c;并将所有与这个点直接相连的边的颜色都翻转&#xff0c;问最少需要选择多少节点才能使所有边的颜色都一样&…

Pycharm2024安装

Pycharm2024安装 1.解压文件 获取方式在最后&#xff01;&#xff01;&#xff01;安装方式一样&#xff01; 2.双击安装 2.1.点击下一步 2.2.根据情况选择安装路径 最好不要使用中文。 2.3.勾选安装配置项 只选择创建桌面快捷方式就行了&#xff0c;其他选项可以不用。…