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

时间:2015-05-14 23:45:13

标签: algorithm microcontroller checksum

我在微控制器上寻找短二进制数据消息(典型值为3-5字节)的良好校验和。我想要一些能够检测到SPI总线上有时会发生的错误的东西,例如逐个和重复(" abc" - >" bcd"和" ABC" - >" AAB&#34)。此外,它应该捕获全零,全1和全相同值的边缘情况。校验和可以增加2-4个字节。

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

2 个答案:

答案 0 :(得分:2)

我最终使用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);
}

答案 1 :(得分:1)

请参阅http://example.com/promo/1了解cksum使用的算法,该算法本身基于以太网标准中使用的算法。它在以太网中的使用是为了捕捉与你所面临的错误类似的错误。

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