尝试理解crc8
。这是我的计算:
poly 100110001 # OneWire
bin 00000001 # 1
1. 000000010 << 1 = 000000100
2. 000000100 << 1 = 000001000
3. 000001000 << 1 = 000010000
4. 000010000 << 1 = 000100000
5. 000100000 << 1 = 001000000
6. 001000000 << 1 = 010000000
7. 010000000 << 1 = 100000000
8. 100000000 ^ 100110001 = 000110001 << 1 = 001100010 == 00110001 # 8 digits
crc8 = 0x31 # online calc true
bin 01000001 # 41
1. 010000010 << 1 = 100000100
2. 100000100 ^ 100110001 = 000110101 << 1 = 001101010
3. 001101010 << 1 = 011010100
4. 011010100 << 1 = 110101000
5. 110101000 ^ 100110001 = 010011001 << 1 = 100110010
6. 100110010 ^ 100110001 = 000000011 << 1 = 000000110
7. 000000110 << 1 = 000001100
8. 000001100 << 1 = 000011000 == 00001100
crc8 = 0xC # online calc true
现在需要141
的crc8
第一个加第二个。使用在线计算器https://ghsi.de/CRC/index.php?Polynom=100110001&消息=141我看到141
的crc8
必须是0xF8
。但0x31 + 0xC
将是3D
。错误在哪里?
首先,CRC不会这样添加。您需要在运行0x01
到之后获取寄存器值,该值给出0x31
,并在馈送0x41
时将其用作起始寄存器值。您需要将0x41
与0x31
互斥,作为第一步,从而生成0x70
。考虑到这一点,八个步骤将为您提供预期的0xf8
。
然而,您还没有到达OneWire CRC-8。CRC-8是在相反的方向上计算的,向下移动而不是向上移动,并使用相反的多项式(不包括x8)。与你所做的和该网站所做的不同,它正在发生变化。更重要的是,信息是反向输入的。