登录/注册

crc16

更多

CRC16 校验算法(中文详解)

CRC16(循环冗余校验)是一种广泛用于数据传输错误检测的算法,通过计算数据的校验码来验证完整性。以下是 CRC16 的实现原理和常见变种


核心参数

不同变种的 CRC16 差异体现在以下参数:


常见 CRC16 变种对比

变种名称 多项式(Poly) 初始值(Init) 输入反转(RefIn) 输出反转(RefOut) 结果异或(XorOut) 应用场景
CRC-16/IBM 0x8005 0x0000 是 (True) 是 (True) 0x0000 Modbus 协议
CRC-16/CCITT 0x1021 0xFFFF 否 (False) 否 (False) 0x0000 XMODEM, Bluetooh
CRC-16/MODBUS 0x8005 0xFFFF 是 (True) 是 (True) 0x0000 工业通信
CRC-16/USB 0x8005 0xFFFF 是 (True) 是 (True) 0xFFFF USB 数据包

Python 实现示例(通用函数)

def crc16(data: bytes, poly: int, init: int, refin: bool, refout: bool, xorout: int) -> int:
    crc = init
    for byte in data:
        if refin:  # 输入反转(低位优先)
            byte = (byte >> 4) | (byte << 4)  # 简化反转逻辑(实际需完整8位反转)
            byte = ((byte & 0xCC) >> 2) | ((byte & 0x33) << 2)
            byte = ((byte & 0xAA) >> 1) | ((byte & 0x55) << 1)
        crc ^= byte << 8  # 当前字节移入寄存器高8位
        for _ in range(8):
            if crc & 0x8000:  # 检查最高位
                crc = (crc << 1) ^ poly
            else:
                crc <<= 1
            crc &= 0xFFFF  # 确保16位

    if refout:  # 输出反转
        crc = (crc >> 8) | (crc << 8)  # 字节交换(简化)
    return crc ^ xorout

# 示例:计算 Modbus 的 CRC16
data = b"\x01\x03\x00\x00\x00\x01"
modbus_crc = crc16(data, poly=0x8005, init=0xFFFF, refin=True, refout=True, xorout=0x0000)
print(f"Modbus CRC16: {modbus_crc:04X}")  # 输出:85C0

关键步骤解析

  1. 初始化寄存器:设为 init 值(如 0xFFFF
  2. 逐字节处理
    • 若需输入反转(refin=True),反转当前字节的比特顺序(如 0x01 → 0x80
    • 将字节移入寄存器,与当前 CRC 值异或
  3. 位运算(核心)
    • 循环 8 次,每次检查寄存器最高位:
      • 若为 1:寄存器左移 1 位,并与多项式 poly 异或
      • 若为 0:仅左移 1 位
  4. 后处理
    • 若需输出反转(refout=True),反转整个 16 位结果
    • xorout 异或得到最终校验值

常见问题

  1. 为何不同场景结果不同?
    CRC16 有多种变种(IBM/CCITT/MODBUS 等),参数组合不同导致结果差异。

  2. 如何验证实现正确?
    使用标准测试数据(如空数据 b""b"123456789")对比在线 CRC 计算器。

  3. 效率优化
    实际应用中使用预计算查表法(256 元素表)加速计算,提升 8 倍速度。

附:CRC16 在线验证工具推荐:Online CRC Calculator

用STM32L05x的CRC模块做modbus CRC16计算,结果不正确是为什么?

根据参考文档,CRC模块可以配置CRC多项式,应该可以做(Modbus)CRC16计算,自己试了一下,发现结果不正确,总是一个固定值,不知道为什

2024-04-29 06:50:17

CRC16在校验数据的时候怎么减少计算量?

CRC16在校验数据的时候怎么减少计算量

2023-10-11 08:25:57

【C语言应用】使用余式表的方式计算CRC16

【C语言应用】使用余式表的方式计算CRC16

2022-08-31 13:10:25

ModeBusRTU调试工具CRC16版下载

ModeBusRTU调试工具CRC16版免费下载。

资料下载 ah此生不换 2022-05-25 14:29:15

16CRC验证码生成VI工具下载

16位CRC验证码生成VI工具下载

资料下载 李健康 2021-03-22 10:40:52

如何使用FPGA实现32位并行数据的CRC16编码器

的LFSR 电路为基础,推导出产生32位并行数据的CRC - 16编码表达式,用EDA 工具设计出CRC -

资料下载 佚名 2021-03-10 15:50:00

CRC16校验码计算器v1.2版应用程序免费下载

用于计算校验CRC16校验结果,软件很好用,单片机485通讯验证的好工具

资料下载 ah此生不换 2019-10-21 08:00:00

使用51单片机内核实现CRC16校验的程序免费下载

本文档的主要内容详细介绍的是使用51内核单片机实现CRC16校验的程序免费下载,同样适用于51内核的其他芯 片(只要稍微修改一下PIC芯片同样适用)

资料下载 旧念 2019-07-05 17:41:00

CRYPTO中的CRC16计算结果有问题怎么解决

cubeMX只启用CRC功能,其余默认配置,编译没有任何问题。调用参考官方例程,CRC32的计算结果没问题,尝试CRC16、

2022-08-18 09:43:40

agile_modbus遇到一个rtu主机要求crc16值要swap时如何处理呢

agile_modbus是支持多主机的,但遇到一个rtu主机要求crc16值要swap时如何处理?遇到modbus的主机要求CRC16值要SWAP时该如何处理呢?

2022-08-02 10:40:55

求基于LABVIEW编程的CRC16/X25校验码校验程序

求基于LABVIEW编程的CRC16/X25校验码校验程序

2022-02-24 11:07:23

CRC16的计算校验码的方式有哪几种?

CRC16的计算校验码的方式有哪几种?如何使用Delphi编写Modbus RTU CRC16的校验码?

2021-11-03 07:20:27

ModBus CRC16校验码学习笔记(附手稿)精选资料分享

ModBus CRC16校验码学习笔记(附手稿)学习背景最近在玩轮毂电机的驱动控制,该电机配套的驱动器可以使用485或者CAN总线协议。该电机的485通信协议的报文中最后两个字节按照某宝卖家

2021-08-30 06:28:27

Labview CRC16(XMODEN)程序

注意:CRC16(XMODEN)程序,进入crc16计算前要先赋初值(0xffff,或0x0000).

2019-09-30 16:10:00

请问XCOM串口助手的CRC16用的是哪个多项式?

XCOM串口助手的CRC16用的多项式是哪个?XCOM能否加个计算CRC16的功能?谢。

2019-09-02 22:29:58
7天热门专题 换一换
相关标签