如何解决计算 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 举报,一经查实,本站将立刻删除。