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

  • 本文关键字:连接 CRC-16 crc crc16
  • 更新时间 :
  • 英文 :


在处理以下PDF时,中有一个示例

第4节:CRC-16代码和示例

(第95或91页(,它显示了CRC16值为133 (LSB)24 (MSB)的串行数据包。

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

  1. Lammert
  2. 精心设计的计算器
  3. CRC计算

但无论我使用的字节组合如何,我都无法获得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为十进制。

crcany还生成了更快的表驱动例程。

如果你把01 02 01 00 11 03 4d 4f 43作为十六进制给Lammert-Bies的计算器,第一个被称为";CRC-16";得到CCD_ 10。

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

最新更新