分享一个CRC8的计算实现
CRC-8软件实现以多项式G(X) = X^8+X^2+X^1+1来实现。
#define FACTOR (0x107 & 0xFF) //多项式因子(取低8bit)
unsigned char calcCRC(unsigned char *pdat, unsigned int len)
{
unsigned char j;
unsigned char crc = 0x00;
while(len--)
{
crc ^= (*pdat++);//前一字节计算CRC后的结果异或上后一字节,再次计算CRC
for (j=8; j>0; j--)
{
crc <<= 1;
if (crc & 0x80)//高位为1,需要异或;否则,不需要
{
crc ^= FACTOR;
}
}
}
return crc;
}
楼主,这个都用在哪些应用上面啊 分形梦想家 发表于 2025-4-27 15:08
楼主,这个都用在哪些应用上面啊
传输数据或才校验数据小于128字节时,可以使用CRC8算法 明白了。
不过,为什么会出错啊 这个CRC8的算法 很实用的。收下了,谢谢楼主分享
CR8校验学习一下 CRC8的算法 很实用的 这个校验与校验和算法,哪个更靠谱一下啊 这个实现很简洁,不过在实际应用中,CRC8的多项式选择和初始化值可能会有所不同,需要根据具体的协议来调整。
这个实现看起来是基于C语言的,使用了一个简单的循环来计算CRC8值。代码简洁,易于理解。
银河漫步 发表于 2025-5-8 15:50
这个校验与校验和算法,哪个更靠谱一下啊
针对不同的出错机制与数据量而定。
比如通讯故障CRC校验和校验和的差别不大,毕竟出错的概率都挺低的。
但对于错过错误,这时校验和的就有点力不从心了 参与一下讨论多项式 0x07,初始值 0xFF,适用于 Modbus、I2C 等校验。
uint8_t crc8(const uint8_t *data, uint8_t len) {
uint8_t crc = 0xFF; // 初始值
for (int i=0; i<len; i++) {
crc ^= data;
for (int j=0; j<8; j++)
crc = (crc << 1) ^ ((crc & 0x80) ? 0x07 : 0);
}
return crc;
}
又见春光 发表于 2025-7-23 22:16
参与一下讨论多项式 0x07,初始值 0xFF,适用于 Modbus、I2C 等校验。
uint8_t crc8(const uint8_t *data,...
Modbus-RTU使用的可是CRC16哟 这个实现看起来是正确的,你使用了标准的CRC算法来计算CRC8。确保在使用前定义了正确的多项式因子。
页:
[1]