crc16
CRC16 校验算法(中文详解)
CRC16(循环冗余校验)是一种广泛用于数据传输错误检测的算法,通过计算数据的校验码来验证完整性。以下是 CRC16 的实现原理和常见变种:
核心参数
不同变种的 CRC16 差异体现在以下参数:
- 多项式(Poly):核心除数(16 位)
- 初始值(Init):计算前的寄存器初值
- 输入/输出反转(RefIn/RefOut):是否反转字节的比特顺序
- 结果异或值(XorOut):最终结果异或掩码
常见 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
关键步骤解析
- 初始化寄存器:设为
init值(如0xFFFF) - 逐字节处理:
- 若需输入反转(
refin=True),反转当前字节的比特顺序(如0x01 → 0x80) - 将字节移入寄存器,与当前 CRC 值异或
- 若需输入反转(
- 位运算(核心):
- 循环 8 次,每次检查寄存器最高位:
- 若为 1:寄存器左移 1 位,并与多项式
poly异或 - 若为 0:仅左移 1 位
- 若为 1:寄存器左移 1 位,并与多项式
- 循环 8 次,每次检查寄存器最高位:
- 后处理:
- 若需输出反转(
refout=True),反转整个 16 位结果 - 与
xorout异或得到最终校验值
- 若需输出反转(
常见问题
-
为何不同场景结果不同?
CRC16 有多种变种(IBM/CCITT/MODBUS 等),参数组合不同导致结果差异。 -
如何验证实现正确?
使用标准测试数据(如空数据b""或b"123456789")对比在线 CRC 计算器。 -
效率优化:
实际应用中使用预计算查表法(256 元素表)加速计算,提升 8 倍速度。
附:CRC16 在线验证工具推荐:Online CRC Calculator
用STM32L05x的CRC模块做modbus CRC16计算,结果不正确是为什么?
根据参考文档,CRC模块可以配置CRC多项式,应该可以做(Modbus)CRC16计算,自己试了一下,发现结果不正确,总是一个固定值,不知道为什
如何使用FPGA实现32位并行数据的CRC16编码器
的LFSR 电路为基础,推导出产生32位并行数据的CRC - 16编码表达式,用EDA 工具设计出CRC -
资料下载
佚名
2021-03-10 15:50:00
使用51单片机内核实现CRC16校验的程序免费下载
本文档的主要内容详细介绍的是使用51内核单片机实现CRC16校验的程序免费下载,同样适用于51内核的其他芯 片(只要稍微修改一下PIC芯片同样适用)
资料下载
旧念
2019-07-05 17:41:00
CRYPTO中的CRC16计算结果有问题怎么解决
cubeMX只启用CRC功能,其余默认配置,编译没有任何问题。调用参考官方例程,CRC32的计算结果没问题,尝试CRC16、
agile_modbus遇到一个rtu主机要求crc16值要swap时如何处理呢
agile_modbus是支持多主机的,但遇到一个rtu主机要求crc16值要swap时如何处理?遇到modbus的主机要求CRC16值要SWAP时该如何处理呢?
ModBus CRC16校验码学习笔记(附手稿)精选资料分享
ModBus CRC16校验码学习笔记(附手稿)学习背景最近在玩轮毂电机的驱动控制,该电机配套的驱动器可以使用485或者CAN总线协议。该电机的485通信协议的报文中最后两个字节按照某宝卖家
换一换
- 如何分清usb-c和type-c的区别
- 中国芯片现状怎样?芯片发展分析
- vga接口接线图及vga接口定义
- 芯片的工作原理是什么?
- 华为harmonyos是什么意思,看懂鸿蒙OS系统!
- 什么是蓝牙?它的主要作用是什么?
- ssd是什么意思
- 汽车电子包含哪些领域?
- TWS蓝牙耳机是什么意思?你真的了解吗
- 什么是单片机?有什么用?
- 升压电路图汇总解析
- plc的工作原理是什么?
- 再次免费公开一肖一吗
- 充电桩一般是如何收费的?有哪些收费标准?
- ADC是什么?高精度ADC是什么意思?
- EDA是什么?有什么作用?
- dtmb信号覆盖城市查询
- 苹果手机哪几个支持无线充电的?
- type-c四根线接法图解
- 华为芯片为什么受制于美国?
- 怎样挑选路由器?
- 元宇宙概念股龙头一览
- 锂电池和铅酸电池哪个好?
- 什么是场效应管?它的作用是什么?
- 如何进行编码器的正确接线?接线方法介绍
- 虚短与虚断的概念介绍及区别
- 晶振的作用是什么?
- 大疆无人机的价格贵吗?大约在什么价位?
- 苹果nfc功能怎么复制门禁卡
- 单片机和嵌入式的区别是什么
- amoled屏幕和oled区别
- 复位电路的原理及作用
- BLDC电机技术分析
- dsp是什么意思?有什么作用?
- 苹果无线充电器怎么使用?
- iphone13promax电池容量是多少毫安
- 芯片的组成材料有什么
- 特斯拉充电桩充电是如何收费的?收费标准是什么?
- 直流电机驱动电路及原理图
- 传感器常见类型有哪些?
- 自举电路图
- 通讯隔离作用
- 苹果笔记本macbookpro18款与19款区别
- 新斯的指纹芯片供哪些客户
- 伺服电机是如何进行工作的?它的原理是什么?
- 无人机价钱多少?为什么说无人机烧钱?
- 以太网VPN技术概述
- 手机nfc功能打开好还是关闭好
- 十大公认音质好的无线蓝牙耳机
- 元宇宙概念龙头股一览