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

计算 CRC16/MCRF4XX

如何解决计算 CRC16/MCRF4XX

我需要一些帮助,因为我似乎无法计算单个字节的 CRC,更不用说字节数组了。

下面是我一直在努力工作的测试代码。请注意,我使用了 this post 中的代码,并且带有字符数组的示例有效,但我需要能够对其进行调整以适用于 uint8_t 数组。

在了解 CRC 的基础知识时,这似乎应该可行,但我可能错了。

我一直在尝试通过使用此 site 检查输出的余数 (crc) 来验证函数

如果有人能指出问题在哪里导致计算错误的 CRC 值,并告诉我为什么会发生这种情况,我们将不胜感激!

#include <cstdint>
#include <iostream>

// Below 2 functions take from 
// https://stackoverflow.com/questions/59486262/issues-calculating-crc16-mcrf4xx-for-more-than-1-byte

int16_t Utils_CRC16_MCRF4XX( uint16_t Crc,uint8_t Byte )
{
    Crc ^= Byte ;

    for( uint8_t i = 0; i < 8; i++ )
    {
        Crc = (Crc & 0x0001) != 0 ? (Crc >> 1) ^ 0x8408 : 
                                    Crc >> 1 ;
    }

    return Crc ;
}

uint16_t crc( uint8_t* pData,uint32_t Len )
{
    uint16_t Crc = 0xffff;

    for( uint32_t i = 0; i < Len; i++ )
    {
        Crc = Utils_CRC16_MCRF4XX( Crc,pData[i] );
    }
    return (Crc);
}

int main()
{
    int8_t val1 = 30;
    int8_t val2 = 30;

    // Arbitrary Test Message
    uint8_t message[] = 
    {
        (uint8_t)54
    };

    /*
    // Sample Test Message (Actually what I intend to transmit)
    uint8_t message[] = 
    {
        (uint8_t)250,(uint8_t)7,(uint8_t)21,(uint8_t)2,(uint8_t)val1,(uint8_t)val2
    };
    */

    //uint8_t test[] = "123456789";

    uint16_t remainder = crc(message,sizeof(message));
    // Expected DEC: 28561
    // Actual DEC: 23346

    std::cout << "CRC: " << remainder << std::endl;

    return 0;
}

解决方法

如果你这样做:

    uint8_t test[] = "123456789";

    uint16_t remainder = crc(test,sizeof(test)-1);

然后你会得到预期的结果,28561。

您需要从 sizeof(test) 中减去 1 以排除终止的 0。

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