微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决CRC-16 串行连接的具体例子

在使用以下 PDF 时,

中有一个示例

第 4 部分:CRC-16 代码和示例

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

但是,我尝试了不同的计算器,例如:

  1. Lammert
  2. Elaborate calculator
  3. CRC calc

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

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

谢谢。

解决方法

这个特定的 CRC 是 CRC-16/ARCcrcany 生成此 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。

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

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

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。