串行连接的CRC-16具体示例

CRC-16 specific example for serial connection

在使用以下 PDF 时,

中有一个示例

Section 4: CRC-16 Code and Example

(第 95 或 91 页)显示 CRC16 值为 133 (LSB)24 (MSB).

的串行数据包

不过,我试过不同的计算器,例如:

  1. Lammert
  2. Elaborate calculator
  3. CRC calc

但无论我使用何种字节组合,我都无法获得 PDF 指示的 CRC16 值。

如何正确计算示例中的 CRC16,最好使用这些计算器之一? (否则,C/C++ 代码应该可以工作)。

谢谢。

这个特定的 CRC CRC-16/ARC. crcany 生成这个 CRC 的代码,其中包括这个简单的按位例程:

#include <stddef.h>
#include <stdint.h>

uint16_t crc16arc_bit(uint16_t crc, void const *mem, size_t len) {
    unsigned char const *data = mem;
    if (data == NULL)
        return 0;
    for (size_t i = 0; i < len; i++) {
        crc ^= data[i];
        for (unsigned k = 0; k < 8; k++) {
            crc = crc & 1 ? (crc >> 1) ^ 0xa001 : crc >> 1;
        }
    }
    return crc;
}

标准接口是 crc = crc16arc_bit(0, NULL, 0); 以获得初始值(在本例中为零),然后 crc = crc16arc_bit(crc, data, len); 使用消息的连续部分来计算 CRC。

如果您对附录中的九字节消息执行此操作,{1, 2, 1, 0, 17, 3, 'M', 'O', 'C'},则返回的 CRC 为 0x1885,它具有十进制的最低有效字节 133,最十进制的有效字节 24

更快的 table 驱动例程也由 crcany 生成。

如果您将 01 02 01 00 11 03 4d 4f 43 作为十六进制输入 Lammert Bies 的计算器,第一个名为“CRC-16”的计算器会给出 0x1885.

如果将 0102010011034d4f43 赋给 crccalc.com 并计算 Calc-CRC16,则第二行是 CRC-16/ARC,结果为 0x1885.