使用C预处理器计算8位CRC?

Roc*_*net 5 c microcontroller crc c-preprocessor

我正在为一个只有几个字节RAM的小型8位微控制器编写代码.它有一个简单的工作,即传输7个16位字,然后传输这些字的CRC.在编译时选择单词的值.CRC具体是"字0到字6的除法的余数,因为无符号数除以多项式x ^ 8 +x²+ x + 1(初始值0xFF)."

是否可以使用C预处理器在编译时计算这些字节的CRC ?

#define CALC_CRC(a,b,c,d,e,f,g)    /* what goes here? */

#define W0    0x6301
#define W1    0x12AF
#define W2    0x7753
#define W3    0x0007
#define W4    0x0007
#define W5    0x5621
#define W6    0x5422
#define CRC   CALC_CRC(W0, W1, W2, W3, W4, W5, W6)
Run Code Online (Sandbox Code Playgroud)

vul*_*ino 1

最简单的校验和算法是所谓的纵向奇偶校验,它将数据分成具有固定位数 n 的“字”,然后计算所有这些字的异或。结果作为额外单词附加到消息中。

为了检查消息的完整性,接收方计算其所有字的异或,包括校验和;如果结果不是带有 n 个零的字,则接收方知道发生了传输错误。

(来源:维基百科)

在你的例子中:

#define CALC_LRC(a,b,c,d,e,f) ((a)^(b)^(c)^(d)^(e)^(f))
Run Code Online (Sandbox Code Playgroud)