我有一个Arduino串行连接,每个传输剩余4位用于校验和。我之前从未做过校验和算法,现在很遗憾。
CRC-4 implementation in C#已经提出了一个问题,但答案并没有真正帮助我前进。
输入应该是一个整数,其中只有10位是重要的。 输出应该是一个字节的4位。
有人可以向我解释我如何调整其他问题的答案或指出另一个方向吗?
byte checksum(int message)
{
//Check sum algorithm
}
答案 0 :(得分:1)
其他算法很容易转换为纯C:
uint8_t calculate(byte[] bytes) {
uint16_t crc = 0xFFFF; // initial value
// loop, calculating CRC for each byte of the string
for (uint8_t byteIndex = 0; byteIndex < bytes.Length; ++byteIndex) {
uint8_t bit = 0x80; // initialize bit currently being tested
for (uint8_t bitIndex = 0; bitIndex < 8; ++bitIndex) {
bool xorFlag = ((crc & 0x8000) == 0x8000);
crc <<= 1;
if (((bytes[byteIndex] & bit) ^ (uint8_t)0xff) != (uint8_t)0xff)
crc = crc + 1;
if (xorFlag)
crc = crc ^ 0x1021;
bit >>= 1;
}
}
return (uint8_t)crc;
}
唯一的区别是使用stdint.h
类型。
我还将crc的类型更改为正好 16位无符号,并且 索引,仅用于保留一些珍贵的arduino内存(每个字节都很重要) 当你只有2.5k的RAM! :-))
虽然,我没有测试或证明读过那段代码,所以它应该和它一样好 原来的C#one。如果它是错误的,那个也将是。
编辑:正如OP在评论中添加的那样,该资源很好地解释了上述CRC算法的工作原理:http://www.barrgroup.com/Embedded-Systems/How-To/CRC-Calculation-C-Code。 HTH