CRC(Cyclic Redundancy Check,循环冗余校验)是一种常用的数据校验算法,广泛应用于通信领域,用于检测数据传输过程中是否发生错误。
CRC的核心思想是:将数据看作一个多项式,与一个预先定义的生成多项式进行模2除法运算,得到的余数就是CRC校验值。接收方对接收到的数据执行同样的运算,如果得到的余数与发送方的CRC值相同,说明数据传输正确。
💡 关键点:CRC是一种检测错误的方法,不能纠正错误。如果检测到错误,通常需要重新传输数据。
CRC运算基于有限域(Galois Field)数学。对于CRC16,我们使用16位的生成多项式。Modbus协议使用的生成多项式是:
生成多项式: G(x) = x^16 + x^15 + x^2 + 1 十六进制表示: 0x8005
由于Modbus使用的是LSB(最低有效位)优先传输,因此实际计算时使用的是多项式的位反转形式:
位反转多项式: 0xA001
Modbus是一种工业通信协议,广泛应用于工业自动化领域。它定义了控制器之间通信的标准方式,支持多种物理层(如RS-485、以太网等)。
在Modbus RTU模式下,每个数据帧都包含一个CRC16校验值,用于检测传输过程中的错误。典型的Modbus帧结构如下:
┌─────────┬───────────────┬─────────┐ │ 地址域 │ 数据域 │ CRC域 │ │ 1字节 │ N字节 │ 2字节 │ └─────────┴───────────────┴─────────┘
CRC16的实现主要有两种方式:
📊 性能对比:查表法通常比计算法快4-8倍,因为查表操作是O(1)的,而计算法需要对每个字节进行8次移位和异或操作。
选择哪种方法取决于您的应用场景:
查表法虽然需要额外的512字节内存(存储256个16位值),但在现代微控制器中这通常不是问题。其主要优势包括:
在计算CRC之前,需要确保数据格式正确:
Modbus协议中,CRC值以低位字节在前、高位字节在后的顺序发送。例如,计算得到的CRC为0x840D,则发送顺序为0x0D, 0x84。
⚠️ 注意:这是一个常见的坑!很多初学者会直接按十六进制顺序发送CRC值,导致通信失败。
在实际项目中使用CRC时,可以考虑以下优化:
© 2026 CRC16 Modbus Tool. All rights reserved.
工业自动化工具 | Modbus协议助手