串口通信的CRC32计算

问题描述 投票:0回答:2

我被指派用 CRC8 的 CRC32 更新现有固件。背景是2个MCU使用串口通信进行通信。当我在网上做一些研究时,我看到了 2 个版本的 CRC 计算。 第一个版本是

uint32_t  CalcCRC32(const uint8_t *pData, uint32_t length, uint32_t crc)
{
    const uint8_t *end = pData + length;

    while (pData < end)
    {
        crc ^= *pData++;

        for(i=0; i<8; i++){
           crc = crc & 0x80000000 ? (crc << 1) ^ 0x04C11DB7 : (crc << 1);
        }
    }

    return crc;
}

第二个版本是

uint32_t CRC32_function(uint8_t *pData, uint32_t len, uint32_t crc){

    uint32_t val, crc;
    uint8_t i;

    crc = 0xFFFFFFFF;
    while(len--){
        val=(crc^*pData++)&0xFF;
        for(i=0; i<8; i++){
            val = val & 0x1 ? (val>>1)^0xEDB88320 : val>>1;
        }
        crc = val^crc>>8;
    }
    return crc^0xFFFFFFFF;
}

我的假设是我必须对第一个 MCU 使用第一个函数,对第二个 MCU 使用第二个函数,因为多项式 0xEDB88320 是 0x04C11DB7 的倒数。我对么?如果没有,我将不胜感激您的建议。 提前致谢。

c microcontroller serial-communication crc32
2个回答
0
投票

不,那是不正确的。你会在两端使用相同的函数,或者至少是等效的计算。

这两个函数计算两个完全不同的 CRC-32。第二个功能是一个非常标准的 CRC-32,称为 CRC-32/ISO-HDLC 广泛使用,并且可用于 zlib 中的快速软件实现(比您显示的简单按位函数快得多)。

第一个函数计算一个没有出现在该 CRC 目录中的纯 CRC,但它可能在它来自的应用程序中使用了预处理和后处理来计算 CRC-32/BZIP2 或 CRC-32/MPEG2。


0
投票

功能提示

在发射器和接收器中使用相同的回路。

速度提示

使用串行通信 - 如果一次执行 1 个字节,即使在高波特率下,如果 CRC 一次执行一个字节,您的 CPU 可能有很多时间来执行 CRC。

IOWs,在发送/接收时计算 CRC,而不是之后。

伪代码

Set-up initial `crc` state.
While there is data to receive/transmit
  send/receiver one byte in `*pData`
  val = (crc ^ *pData++) & 0xFF;
  for (i=0; i<8; i++){
    val = val & 0x1 ? (val>>1)^0xEDB88320 : val>>1;
  }
  crc = val ^ crc>>8;
}
Finish CRC.

现在您的 CRC 计算不会在最后一个字节之后花费大量时间 - 延迟方面的改进。

© www.soinside.com 2019 - 2024. All rights reserved.