Mal*_*lte 1 c microcontroller serial-port arduino crc
我试图理解(并随后实现)干净飞行四轴飞行器固件用于 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 }
Run Code Online (Sandbox Code Playgroud)
我不明白这是如何运作的。如果我要实现这个,我会迭代计算包的所有字节的 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.
Run Code Online (Sandbox Code Playgroud)
提前致谢,
马尔特
如果 CRC 正确存储在消息末尾,则假设没有错误,则它具有以下属性:消息的 CRC 和串联的 CRC 是常量。根据 CRC 的定义,该常数可以为零。
原因是 CRC 本质上是消息乘以x n的多项式除法的余数,其中n是 CRC 长度(以位为单位)。因此,当您将 CRC 添加到消息中时,您将用余数替换最后n个零,从而导致整个除法没有余数。(请注意,二元多项式的负数就是该多项式,因为某物与其自身的异或为零。)
是的,如果您愿意,您可以只计算消息的 CRC,然后将结果与附加到消息的 CRC 进行比较。
归档时间: |
|
查看次数: |
1079 次 |
最近记录: |