计算 CRC16/MCRF4XX 的问题
Issues with calculating CRC16/MCRF4XX
我需要一些帮助,因为我似乎无法计算单个字节的 CRC,更不用说字节数组了。
下面是我一直在努力工作的测试代码。请注意,我使用了 中的代码,并且带有字符数组的示例有效,但我需要能够对其进行调整以使其适用于 uint8_t
.
的数组
在了解 CRC 的基础知识时,这似乎应该可行,但我可能弄错了。
我一直在尝试通过使用此 site.
检查输出的余数 (crc) 来验证函数
如果有人可以确定导致计算错误 CRC 值的问题出在哪里,并告诉我为什么会发生这种情况,我们将不胜感激!
#include <cstdint>
#include <iostream>
// Below 2 functions take from
//
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)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。
我需要一些帮助,因为我似乎无法计算单个字节的 CRC,更不用说字节数组了。
下面是我一直在努力工作的测试代码。请注意,我使用了 uint8_t
.
在了解 CRC 的基础知识时,这似乎应该可行,但我可能弄错了。
我一直在尝试通过使用此 site.
检查输出的余数 (crc) 来验证函数如果有人可以确定导致计算错误 CRC 值的问题出在哪里,并告诉我为什么会发生这种情况,我们将不胜感激!
#include <cstdint>
#include <iostream>
// Below 2 functions take from
//
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)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。