CRC-16 Modbus校验含代码

Modbus CRC16校验方法及实现代码 0.前言 项目中所用到的DI数字开关模块通信方式为串口通信,内置数据校验方式为Modbus CRC16。 这种校验方式第一次遇到,于是百度了一下,找到这篇文章,按照步骤,自己写了下代码,对比了下文中代码,基本一样。 1.实现步骤及代码 实现步骤 代码实现 #include<iostream> #include <stdio.h> using namespace std; int main() { unsigned short CRC = 0xffff;//(1)CRC寄存器初值 阅读详情

工作原理

CRC-16 Modbus校验的工作原理基于一个简单的原理:对数据进行某种形式的加工,然后将结果(称为“校验和”)附加到数据上。接收方可以通过对接收到的数据执行相同的加工操作,并比较结果和附加的校验和,来检测数据是否在传输过程中被更改。

具体来说,CRC-16 Modbus校验的计算过程如下:

  1. 初始化一个16位的CRC值为0xFFFF。
  2. 遍历数据中的每一个字节,并将其与当前的CRC值进行异或操作。
  3. 对于每一个位,如果最低位(LSB)被设置了,那么就向右移位并与0xA001进行异或操作。如果LSB没有被设置,那么就只进行向右移位操作。
  4. 重复步骤2和3,直到处理完所有的数据。
    返回最后得到的CRC值。

C-demo

#include <stdint.h>

uint16_t crc16_modbus(uint8_t *data, uint16_t length) {
    uint16_t crc = 0xFFFF;
    for (uint16_t pos = 0; pos < length; pos++) {
        crc ^= (uint16_t)data[pos];    
        for (int i = 8; i != 0; i--) { 
            if ((crc & 0x0001) != 0) {  
                crc >>= 1;             
                crc ^= 0xA001;
            }
            else                        
                crc >>= 1;             
        }
    }
    return crc;
}

C++ -demo

#include <cstdint>
#include <vector>

class CRC16Modbus {
public:
    static uint16_t calculate(const std::vector<uint8_t>& data) {
        uint16_t crc = 0xFFFF;
        for (const auto& byte : data) {
            crc ^= static_cast<uint16_t>(byte);
            for (int i = 0; i < 8; i++) {
                if ((crc & 0x0001) != 0) {
                    crc >>= 1;
                    crc ^= 0xA001;
                } else {
                    crc >>= 1;
                }
            }
        }
        return crc;
    }
};

python-demo

def crc16_modbus(data):
    crc = 0xFFFF
    for byte in data:
        crc ^= byte
        for _ in range(8):
            if crc & 0x0001:
                crc >>= 1
                crc ^= 0xA001
            else:
                crc >>= 1
    return crc
三菱FX3SA的ST语言实战:手把手教你写Modbus RTU的CRC16校验程序 本文详细介绍了在三菱FX3SA PLC中使用ST语言实现Modbus RTU的CRC16校验程序。从协议规范到代码实现,逐步构建工业级可用的CRC校验模块,涵盖开发环境配置、算法实现、调试技巧及性能优化,帮助工程师快速掌握PLC通信中的关键校验技术。 阅读详情

相关推荐

CRC_16---ModBus 计算方法及代码实现

1、 CRC寄存器初始值为 0xFFFF;即16个字节全为1; 2、 CRC-16 / ModBus的多项式0xA001H (1010 0000 0000 0001B) ; ‘H’表示16进制数,‘B’表示二进制数。 计算步骤为: (1).预置 16 位寄存器为十六进制 0xFFFF(即全为 1) ,称此寄存器为 CRC 寄存器; (2).把第一个 8 位数据与 16 位 CRC 寄存器的低位相异或,把结果放于 CRC 寄存器; (3).检测相异或后的CRC寄存器的最低位,若最低位为1,CRC寄存器

1万+

Python实现CRC16算法

本文介绍CRC算法的基本原理,并使用Python实现CRC16算法。

斌赋的博客 4941

CRC16校验的Python实现

CRC16校验算法是一种基于二进制多项式的循环冗余校验算法。它通过对数据进行位运算和模运算来生成一个16位的校验值,用于验证数据的准确性。通过以上代码,我们可以方便地在Python中实现CRC16校验算法,并对数据进行校验。请注意,这只是一个基本的实现示例,实际应用中可能需要根据具体需求进行适当的修改和优化。最后,我们将计算出的CRC16校验值转换为16进制字符串,并打印输出。的函数,该函数接受一个字节数组作为输入,并返回对应的CRC16校验值。完成所有字节的处理后,函数返回最终的CRC16校验值。

ByteHackerX的博客 1321

python实现crc16算法

纯代码实现crc16算法

tww124849980的博客 7299

STM32F10x实战级Modbus RTU从站通信代码包(含CRC-16校验与多功能码框架)

直接可用的STM32F10x Modbus RTU从站通信实现,已在实际工业设备中稳定运行。代码严格遵循Modbus RTU协议规范,内置标准CRC-16(Modbus)校验算法,支持0x01读线圈功能码默认启用,同时预留0x03读保持寄存器、0x05写单个线圈、0x06写单个保持寄存器等常用功能码接口,逻辑结构完整、扩展方便。采用清晰分层设计:com.c处理USART底层收发与中断响应,mb.c实现协议解析状态机,mb_func.c集中管理各功能码响应逻辑,mb_crc.c提供高效CRC计算。配套完整头文

bush的博客 256

用VB.net自写串口调试工具:Modbus RTU与CRC16校验实战指南

串口通信是工业自动化与嵌入式开发中最基础也最关键的环节。理解波特率、数据位、停止位、校验位等电气参数,是确保设备互通的前提。在Modbus RTU协议中,报文由地址码、功能码、数据域和CRC16校验码构成,CRC16的算法原理和字节序处理直接决定通信是否成功。VB.net的SerialPort组件为开发者提供了便捷的串口收发能力,但跨线程UI更新、半包粘包、十六进制字符串与字节流互转等问题,仍需工程化处理。掌握这些技术,就能自研一款高效的串口调试工具,用于RS485总线上的仪表数据采集、协议测试与故障排查。

weixin_29913663的博客 244

Modbus-crc16校验原理和方法(含测试代码以及演算过程)

本文主要讲了modbuscrc16的计算方法和手算验证过程。以及一些modbus的基础知识

m0_47673526的博客 4万+

迪文串口屏CRC16校验源码包:含Modbus与TapeZBC双模式,支持STM32/51/AVR裸机移植

专为迪文DGUS系列串口屏通信设计的CRC16校验C语言实现,内置Modbus RTU和TapeZBC两种校验算法,开箱即可集成进嵌入式项目。提供两种实现方式:查表法(速度快、占ROM)和纯位运算法(节省存储、无查表依赖),均不使用浮点运算或动态内存分配,适配裸机环境。接口统一简洁——传入数据缓冲区指针和长度,直接返回16位校验值。已通过真实迪文屏通信验证,兼容主流MCU平台如STM32、STC89C51、ATmega32等;移植时仅需按目标平台调整uint8_t、uint16_t类型定义及字节序(大端/小

red88的博客 229

Modbus通信CRC16校验程序

ModBus 通信协议的CRC ( 冗余循环校验码)含2个字节, 即 16 位二进制数。CRC码由发送设备计算, 放置于所发送信息帧的尾部。接收设备再重新计算所接收信息的CRC, 比较计算得到的CRC是否与接收到的CRC相符, 如果两者不相符, 则认为数据出错。 1. CRC16计算方法 1) 预置 1 个 16 位的寄存器为十六进制FFFF(即全为 1) , 称此寄存器为 CRC寄存器...

oshan2012的博客 1947

STM32F103实现MODBUS-RTU主机从机完整代码:从CRC16校验到多从机轮询

工业自动化和物联网设备通信中,串行总线协议是设备互联的基础。MODBUS-RTU凭借简单可靠的结构,成为现场仪表、PLC和上位机之间应用最广泛的通信协议之一。其帧由地址码、功能码、数据域和CRC16校验组成,CRC校验确保数据在传输过程中的完整性,是通信稳定的关键一环。在以STM32F103为代表的主流MCU上实现MODBUS-RTU主机与从机,既涉及USART串口配置、字节超时判定与功能码分发逻辑,也包含RS485总线收发控制、多从机轮询调度和异常重试策略。实际调试中还常遇到波特率偏差、CRC参数不匹配、

weixin_29185493的博客 273

ModbusCrc16校验码算法C#源码

Modbus Crc16校验码算法C#源码

Verilog C语言实现的CRC16校验高低字节分别在前

Verilog C语言实现的CRC16校验高低字节分别在前 去发现同类优质开源项目:https://gitcode.com/ 本项目提供了使用Verilog语言实现的CRC16校验代码,该代码基于之前一位大神用C语言编写的多种模式CRC16校验。经过在C-Free软件中的验证,所有模式均无问题。本项目特别将Modbus格式的C语言CRC16校验转换为Verilog实现,并经过实际测试验证无误。 项...

gitblog_06703的博客 568

modbus crc16校验程序

modbus crc16校验程序。输入modbus格式字符串,计算字符串的modbus crc16计算结果。

【MODBUS】一文搞懂 Modbus-RTU 报文与 CRC 校验计算

摘要:本文详解Modbus-RTU通信协议的核心要点,包括报文结构、CRC校验计算及实战应用。重点解析了写单个寄存器(功能码06)的报文生成过程,并详细介绍了CRC-16(Modbus)校验算法,包含初始值0xFFFF、多项式0xA001等关键参数。文章提供了C语言和Python两种实现方案,强调CRC结果必须按"低字节在前"排列。最后总结了常见问题解答,如CRC计算范围、功能码区别等,为工业通信开发提供实用指导。

"謓泽"正在路上朝着"攻城狮"方向"前进四"! 3014

3D Slicer5.7在win11下的源码编译安装

本博客主要参考官方安装文档以及部分优快云的博客,部分内容的书写会直接参考官方文档的内容。

Topsort的博客 4760

西门子828D/840DSL数控机床产量数据采集实战:一个C#程序员的踩坑与填坑记录

本文详细记录了C#程序员在西门子828D/840DSL数控机床产量数据采集实战中的经验与教训。从硬件连接到软件配置,再到数据读取与异常处理,文章分享了工业现场编程的特殊挑战和解决方案,特别是针对数控系统的TCP/IP通信、PLC变量地址映射及数据解析等关键技术点。

weixin_42741930的博客 596

ST语言编写的Modbus通信CRC16校验程序

ST语言编写的Modbus通信CRC16校验程序 去发现同类优质开源项目:https://gitcode.com/ 此文档提供了一款使用ST语言编写的Modbus通信CRC16校验程序,适用于施耐德somachine软件。该程序经过测试,能够正常使用。文档下载后,可以直接在您的项目中使用,无需额外配置。 文件描述 文件名:ST语言编写Modbus通信CRC16校验程序.docx 内容:包含详细的...

gitblog_06707的博客 445

MaxEnt软件的下载与安装

1、下载网站:http://lucky-boy.ys168.com/ (这是之前在网上搜到的,里面有许多软件安装包,感谢网页主的资源共享,违权必删)

weixin_42191203的博客 2万+

Verilog C语言实现的CRC16校验高低字节分别在前:为开发者提供高效校验工具

Verilog C语言实现的CRC16校验高低字节分别在前:为开发者提供高效校验工具 去发现同类优质开源项目:https://gitcode.com/ 项目介绍 CRC16是一种常用的校验算法,广泛应用于通信、存储等领域,用于检测数据传输或存储过程中的错误。Verilog C语言实现的CRC16校验高低字节分别在前项目,为开发者提供了一种在Verilog环境下实现CRC16校验的方法。此项目基于C...

gitblog_06756的博客 787

带挂牵引车前向运动模型推导及仿真实现

牵引车-半挂车的车辆结构与普通的车辆相比增加了一个半挂车,它们之间通过鞍座相连接,为了分析半挂牵引车运动过程中的位姿和状态,本文将基于车辆的机械结构建立对应的运动学模型,该模型基于以下假设: 车辆行驶过程中,道路平坦且无凸凹; 车辆低速行驶,且运行过程中车身无侧倾和俯仰运动; 车辆行驶过程中,轮胎无形变,无侧向滑动,且无侧向力; 牵引车和半挂车均满足阿克曼转向几何原理; 牵引车与半挂车不会发现折叠。

jianmo的博客 3182

从时序参数到电压供给:TTL(RGB)液晶屏驱动调试全解析

本文全面解析TTL(RGB)液晶屏驱动调试的关键技术,从时序参数配置到电压供给系统搭建,详细介绍了同步信号参数、寄存器配置技巧以及升压电路设计。通过实战案例和常见故障分析,帮助工程师快速掌握液晶显示屏调试方法,提升开发效率。

weixin_30588675的博客 247

CRC校验:Modbus数据帧的“指纹”

摘要:CRC校验是Modbus-RTU数据帧的关键保护机制,通过多项式除法生成16位"指纹"来检测传输错误。相比简单的累加和,CRC能检测单bit、双bit等各类错误,检测能力更强。文章详解了CRC16的计算原理(多项式0x8005)、查表优化法、初始值设置(0xFFFF)及字节序要求(低字节在前)。工业现场通过CRC确保数据完整性,防止干扰导致的误动作。硬件CRC模块可加速计算,但需注意不同设备的参数差异。CRC作为数据的"指纹"守护者,有效保障通信可靠性。

m0_38123813的博客 232

30 中望CAD二次开发(ZRX C++)-windows下的qt开发

本文介绍了中望CAD在windows下,如何使用qt开发插件界面,给出了具体的编码步骤,并生成了模态对话框和非模态对话框,其中非模态对话框可以调用CAD命令,实现交互操作。

cilvsuanna的博客 189
上一篇: 单链表demo(C语言)
下一篇: 嘉立创免费领券打样--领券流程及地址
DennisReYoonjiho
博客等级 码龄7年 216粉丝 34原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值