【问题标题】:CRC16 generation & verificationCRC16 生成和验证
【发布时间】:2017-01-24 12:55:57
【问题描述】:

我正在尝试了解(并随后实施)clean flight quadrocopter 固件用于 srxl 包验证的 crc16 验证。

SRXL 是一种简单的串行协议,用于通过单条串行线传输伺服值。

包结构是这样的:

crc16 由以下函数验证:

//srxlFrameLength is the package length
//srxlFrame is the received package buffer
uint16_t crc_calc = 0; 
for (i = 0; i < srxlFrameLength; i++) {
    crc_calc =  crc16_CCITT(crc_calc, srxlFrame[i]);
}
if(crcCalc == 0){ //package is valid }

我不明白这是如何工作的。如果我要实现这个,我会迭代地计算包的所有字节的 crc,直到我到达保存的 crc,然后与保存的 crc 进行比较。为什么这个实现也有效?

我还想为发送方实现一个包生成器代码。 是否可以像这样实现 crc 生成:

uint16_t crc_calc = 0;     
for(int i = 0; i < packetLength; ++i){
     crc_calc = crc16_CCITT(crc_calc, packet[i]);
}
//concat calculated crc16 to packet here.

提前致谢,

麦芽酒

【问题讨论】:

    标签: c arduino serial-port microcontroller crc


    【解决方案1】:

    如果 CRC 正确存储在消息的末尾,则它具有消息的 CRC 和连接的 CRC 是一个常数的属性,假设没有错误。根据 CRC 的定义,该常数可以为零。

    原因是 CRC 本质上是消息乘以 xn 的多项式除法的余数,其中 n 是 CRC比特长度。因此,当您将 CRC 添加到消息中时,您将用余数替换最后的 n 个零,从而导致整个事物的除法没有余数。 (请注意,二元多项式的负数就是该多项式,因为某事物与自身的异或为零。)

    是的,如果您愿意,您可以只计算消息的 CRC,然后将结果与附加到消息的 CRC 进行比较。

    【讨论】:

    • 非常感谢,这很有道理。我想我现在会看看 CRC 的细节。
    猜你喜欢
    • 1970-01-01
    • 2021-08-12
    • 1970-01-01
    • 2018-07-26
    • 1970-01-01
    • 2017-06-22
    • 1970-01-01
    • 2012-05-20
    • 2015-02-21
    相关资源
    最近更新 更多