微控制器上短数据的校验和?

Checksum for short data on microcontroller?

我正在为微控制器上的短二进制数据消息(通常为 3-5 个字节)寻找一个好的校验和。我想要一些可以检测 SPI 总线上有时会发生的错误类型的东西,例如错误和重复("abc" -> "bcd",和 "abc"-> "aab")。它还应该捕捉全零、全一和全相同值的边缘情况。校验和可以增加2-4个字节。

运行 速度并不重要,因为它不会处理太多数据;但代码大小有点重要。

请参阅 http://pubs.opengroup.org/onlinepubs/009695299/utilities/cksum.html 以了解 cksum 使用的算法,它本身基于以太网标准中使用的算法。它在以太网中的用途是捕获与您遇到的错误类似的错误。

该算法将为您提供任意大小数据的 4 字节校验和。

我最终使用了 CRC16 CCITT。这在目标系统上只有约 50 字节的编译代码(不使用任何查找表!),运行速度相当快,并且可以很好地处理全零和全一的情况。

代码(来自http://www.sal.wisc.edu/st5000/documents/tables/crc16.c):

unsigned short int
crc16(unsigned char *p, int n)
{
    unsigned short int crc = 0xffff;

    while (n-- > 0) {
        crc  = (unsigned char)(crc >> 8) | (crc << 8);
        crc ^= *p++;
        crc ^= (unsigned char)(crc & 0xff) >> 4;
        crc ^= (crc << 8) << 4;
        crc ^= ((crc & 0xff) << 4) << 1;
    }

    return(crc);
}