Modbus CRC16 算法(举例)

Modbus CRC16 算法(举例)

1. Modbus CRC16 算法规范

Modbus 用的 CRC 算法标准称为 “Modbus CRC-16”​ 或 “CRC-16-IBM”,也叫 CRC-16-ANSI,多项式为:

多项式 = x 16 + x 15 + x 2 + 1 多项式=x^{16} + x^{15} + x^{2} + 1 多项式=x16+x15+x2+1

用 16 进制表示时,多项式是 0x8005(但注意,Modbus 是高位在前运算,这里 Modbus 采用的是位逆序后的 0xA001​ 进行右移计算)。

算法初始值和结果异或:
初始 CRC 值 = 0xFFFF
实际上,在 Modbus RTU 中,计算时每个字节先与 CRC 低字节异或,然后 CRC 右移 1 位,如果移出位是 1 则与多项式 0xA001 异或(这是 0x8005 的位逆序多项式)。计算完所有字节后,得到的 CRC 值在传输时是低字节在前(Little-endian 字节顺序)附加在帧末尾。

简单概括
取当前数据的 1 位,与 CRC 的低位(bit 0)异或,结果记为 xorBit,然后 CRC 右移 1 位,如果 xorBit为 0,继续取数据的下一位;如果 xorBit为 1,则 CRC 与多项式 0xA001 异或。

2. 对 01 03 00 00 00 01进行 CRC 计算

用这个算法来算。

字节 0x01:
crc = 0xFFFF ^ 0x01 = 0xFFFE (1111 1111 1111 1110)
循环 8 次(一次一位):
位 0:crc & 1 = 0 → 右移 1 位:0x7FFF
位 1:0x7FFF & 1 = 1 → 右移 1 位得 0x3FFF,然后异或 0xA001:
0x3FFF ^ 0xA001 = 0x9FFE
位 2:0x9FFE & 1 = 0 → 0x4FFF
位 3:0x4FFF & 1 = 1 → 右移:0x27FF ^ 0xA001 = 0x87FE
位 4:0x87FE & 1 = 0 → 0x43FF
位 5:0x43FF & 1 = 1 → 右移:0x21FF ^ 0xA001 = 0x81FE
位 6:0x81FE & 1 = 0 → 0x40FF
位 7:0x40FF & 1 = 1 → 右移:0x207F ^ 0xA001 = 0x807E
处理完字节 0x01 后,CRC = 0x807E。

字节 0x03:
crc ^= 0x03 → 0x807E ^ 0x03 = 0x807D
循环 8 次:
0x807D & 1 = 1 → 右移:0x403E ^ 0xA001 = 0xE03F
0xE03F & 1 = 1 → 右移:0x701F ^ 0xA001 = 0xD01E
0xD01E & 1 = 0 → 0x680F
0x680F & 1 = 1 → 右移:0x3407 ^ 0xA001 = 0x9406
0x9406 & 1 = 0 → 0x4A03
0x4A03 & 1 = 1 → 右移:0x2501 ^ 0xA001 = 0x8500
0x8500 & 1 = 0 → 0x4280
0x4280 & 1 = 0 → 0x2140
CRC = 0x2140

字节 0x00:(跟0异或结果是本身)
crc ^= 0x00 = 0x2140
循环 8 次(每次 crc & 1 都是 0,因为 0x2140 二进制 0010 0001 0100 0000,最低位是 0,但右移过程中最低位会变化,我们仔细算):
0x2140 & 1 = 0 → 0x10A0
0x10A0 & 1 = 0 → 0x0850
0x0850 & 1 = 0 → 0x0428
0x0428 & 1 = 0 → 0x0214
0x0214 & 1 = 0 → 0x010A
0x010A & 1 = 0 → 0x0085
0x0085 & 1 = 1 → 右移:0x0042 ^ 0xA001 = 0xA043
0xA043 & 1 = 1 → 右移:0x5021 ^ 0xA001 = 0xF020
CRC = 0xF020

字节 0x00:
crc ^= 0x00 = 0xF020
循环:
0xF020 & 1 = 0 → 0x7810
0x7810 & 1 = 0 → 0x3C08
0x3C08 & 1 = 0 → 0x1E04
0x1E04 & 1 = 0 → 0x0F02
0x0F02 & 1 = 0 → 0x0781
0x0781 & 1 = 1 → 右移:0x03C0 ^ 0xA001 = 0xA3C1
0xA3C1 & 1 = 1 → 右移:0x51E0 ^ 0xA001 = 0xF1E1
0xF1E1 & 1 = 1 → 右移:0x78F0 ^ 0xA001 = 0xD8F1
CRC = 0xD8F1

字节 0x00:
crc ^= 0x00 = 0xD8F1
循环:
0xD8F1 & 1 = 1 → 右移:0x6C78 ^ 0xA001 = 0xCC79
0xCC79 & 1 = 1 → 右移:0x663C ^ 0xA001 = 0xC63D
0xC63D & 1 = 1 → 右移:0x631E ^ 0xA001 = 0xC31F
0xC31F & 1 = 1 → 右移:0x618F ^ 0xA001 = 0xC18E
0xC18E & 1 = 0 → 0x60C7
0x60C7 & 1 = 1 → 右移:0x3063 ^ 0xA001 = 0x9062
0x9062 & 1 = 0 → 0x4831
0x4831 & 1 = 1 → 右移:0x2418 ^ 0xA001 = 0x8419
CRC = 0x8419

字节 0x01:
crc ^= 0x01 = 0x8418
循环:
0x8418 & 1 = 0 → 0x420C
0x420C & 1 = 0 → 0x2106
0x2106 & 1 = 0 → 0x1083
0x1083 & 1 = 1 → 右移:0x0841 ^ 0xA001 = 0xA840
0xA840 & 1 = 0 → 0x5420
0x5420 & 1 = 0 → 0x2A10
0x2A10 & 1 = 0 → 0x1508
0x1508 & 1 = 0 → 0x0A84
CRC = 0x0A84

最终 CRC = 0x0A84

3. 传输顺序

CRC 计算结果 0x0A84 在传输时,低字节在前,即先发 0x84,再发 0x0A。
所以整帧为:

01 03 00 00 00 01 84 0A 

4. CRC(循环冗余校验)在线计算

网址:CRC(循环冗余校验)在线计算

在这里插入图片描述

Read more

ChatGPT替代品?LocalAI+CPolar打造你的隐私保护AI实验室

ChatGPT替代品?LocalAI+CPolar打造你的隐私保护AI实验室

文章目录 * 前言 * 【视频教程】 * 1. Docker部署 * 2. 简单使用演示 * 3. 安装cpolar内网穿透 * 4. 配置公网地址 * 5. 配置固定公网地址 前言 当你用AI处理客户合同却担心数据被训练时,当企业因合规要求禁止使用云端API时——LocalAI的出现就像给数据安全上了"双重保险"。这款开源工具能让Llama、Phi等大模型直接跑在你的笔记本上,全程不上传任何数据,还完美兼容OpenAI API。特别适合处理商业机密的律师、需要离线工作的科研人员,以及对"数据主权"有执念的技术极客。最惊艳的是它的CPU推理能力:我的老旧ThinkPad都能流畅运行7B模型,彻底打破"AI必须依赖GPU"的神话 🖥️ 作为经常处理敏感数据的程序员,我被它的"隐形模式"彻底征服。上周帮医疗团队分析病例文本,LocalAI在本地完成实体识别,原始数据从未离开医院内网——这种"

By Ne0inhk

JSP 文件上传详解

JSP 文件上传详解 引言 在Web开发中,文件上传是一个常见的功能,它允许用户将文件从客户端发送到服务器。Java Server Pages(JSP)作为一种强大的服务器端技术,也支持文件上传功能。本文将详细讲解JSP文件上传的实现过程,包括技术原理、实现步骤和注意事项。 技术原理 JSP文件上传主要依赖于HTTP协议的multipart/form-data编码类型。这种编码类型允许表单中包含文件类型的输入字段。当用户提交表单时,浏览器会将表单数据以文件的形式发送到服务器。 服务器端使用Java的javax.servlet包中的HttpServletRequest和HttpServletResponse对象来接收这些文件。同时,javax.servlet包中的javax.servlet.http模块提供了Part接口,用于访问上传的文件内容。 实现步骤 以下是使用JSP实现文件上传的基本步骤: 1. 创建HTML表单 首先,我们需要创建一个HTML表单,其中包含一个文件类型的输入字段。以下是一个简单的示例: <form action="upload.jsp"

By Ne0inhk

90% 的 Java 程序员其实没真正理解这些语法:从对象模型到多态机制一次讲透

在多数项目里,代码能跑并不代表设计合理。很多隐藏的 Bug、难以维护的结构甚至线上问题,往往都源于对 Java 基础语法理解不够深入:引用到底是什么?构造方法执行顺序如何?为什么子类对象能赋给父类引用?这些看似“入门级”的知识,如果只停留在表面,很容易在复杂系统中埋下隐患。与其零散记忆语法规则,不如从对象模型与运行机制的角度系统梳理一遍,让这些概念在工程实践中真正落地。 一、类与文件规则:不仅是语法要求,更是工程约束 Java 要求 public 修饰的类必须与文件名一致,且一个源文件中只能有一个 public 类。这种设计保证了类加载与编译过程的可预测性,也让大型项目的模块结构更加清晰。 类体由成员变量与方法组成,用于描述对象的状态与行为。即便类体为空,它仍然是一个合法类型,这体现了 Java 强调“类型即抽象”的设计思想。 二、类与对象:抽象模型与实例的关系 类是对现实事物的抽象,对象则是类的具体实例。Java 的类型体系由基本类型与引用类型构成,其中数组也属于对象类型的一种特殊形式。 与

By Ne0inhk
推荐12款AI免费一键生成PPT的网站【2026年最新】

推荐12款AI免费一键生成PPT的网站【2026年最新】

一、引言 你有没有过这种体验?为了一份 PPT 熬到深夜,字体、配色反复调整......结果成品还是显粗糙。如今 AI 早已融入各行各业,利用其快速做高质量 PPT,已成职场人、学生和教师的刚需。 但市面上 AI PPT 工具太多,有的求快、有的重设计,收费也乱,该怎么选才不踩坑? 经过对12大主流的AI生成PPT工具的深度对比,从大纲生成、模板内容到付费模式都一一做了详细的对比。不管你是赶工作周报、准备路演 PPT,还是做教学课件、毕业答辩稿,都能在这找到适配的选择。 二、PPT一键生成工具 1. 博思PPT 博思AIPPT是新一代AI智能PPT生成平台,通过深度学习技术实现从内容生成到视觉设计的全流程自动化。 传送入口:https://ai-to.cn/url?u=pptgo 推荐指数:⭐⭐⭐⭐ 示例:个人成就与挑战之年度回顾。 内容框架很贴合年度总结的需求,

By Ne0inhk