当前位置: 首页 > 知识库问答 >
问题:

如何确定CRC16的初始校验和,使结果校验和为零

毕瀚
2023-03-14

因为我每次都希望得到完全相同的数据包,所以当数据包有效时,我希望CRC校验和为零,而当存在传输错误时,我希望CRC校验和不为零。

我知道当发送数据包时,我可以将计算出的CRC16添加到数据包的末尾,并且在接收端,CRC校验将输出0,但是在这种情况下,不可能将CRC16校验和添加到数据包,因为数据包是由SPI线上的多个发送方芯片构造的,每个芯片只填充整个数据包中自己的两个字节。

我需要在接收端加载一个初始CRC校验和,因此在检查传入的数据包后,结果CRC等于零(如果数据包完好无损)。

任何帮助都将不胜感激!

你好,妮可

共有1个答案

罗星洲
2023-03-14

解决方案是简单地使用基于CRC的查找表。如果您不能将校验和(又名帧校验序列,FCS)附加到包中,那么首先进行表查找,然后简单地将该校验和与固定数据的预期序列进行比较。

请注意,“CRC 16”可能意味着任何东西,有多个版本和(非)标准。最常见的一个可能是一个叫做“CRC-16-CCITT”的1021h poly和初始值FFFFh,但即使是这个,也有多种算法--有些是正确的,有些是错误的。您最大的挑战将是找到一个值得信赖的CRC算法。

然而,我实际上认为SAMD在芯片上专门使用硬件生成的CRC-16-CCITT,用于DMA目的。因为这是SPI,所以它应该是DMA的,所以也许调查一下你是否可以使用它。

 类似资料:
  • 我正试图为一个P1 meter消息的CRC16校验和编写一个单元测试(而且很难把它弄对...)。 我所拥有的是: null 来源可以在这里找到 CRC是对数据消息中的前面字符计算的CRC16值(从“/”到“!”,使用多项式:x16+x15+x2+1)。 CRC16不使用异或输入,不使用异或输出,并以最低有效位优先计算。该值表示为4个十六进制字符(MSB优先)。 @马克·阿德勒,我修复了你发现的问题

  • 问题内容: 是否可以选择表中的整行并获得某种校验和?我正在寻找一种方法,告诉我的代码仅在更改了至少一条记录后才更新数据。从数据更改跟踪的角度来看,这将有助于我减少历史记录表中记录的许多更改。- 谢谢。 问题答案: 您可以结合使用和函数来为该行生成MD5校验和: 如果其中一列是可为空的,请确保将其包装在中,因为null会使结果也为null。 另请注意,这不是100%安全的。如果从一列中删除1个字符并

  • 我最近想使用CRC-32校验和进行文件完整性检查,并试图以同样的方式验证它,但似乎这种“对比零技巧”在这里是不可能的?! 例如,如果我在CRC在线计算器上使用32位值0xdeadbeef: https://www.lammertbies.nl/comm/info/crc-calculation.html 谁能解释一下,为什么这个“零比零技巧”对CRC-32不起作用?

  • 问题内容: 我正在寻找一种为任何类型的Java对象生成校验和的解决方案,对于产生相同对象的应用程序的每次执行,该校验和都保持不变。 我尝试了,但是api说 ....从应用程序的一个执行到同一应用程序的另一个执行,此整数不必保持一致。 问题答案: 我遇到了类似的问题(为XML文件生成良好的哈希码),我发现最好的解决方案是通过MessageDigest使用MD5,或者如果您需要更快的速度:Fast M

  • 正如你已经发现的,调试汇编代码非常的困难和容易受到挫折。 我建议你先把你需要优化的小段代码用高级语言写成一个子程序。 然后写个小的测试程序可以充分测试你的这个子程序。 确认测试程序可以测试到所有的分支和边界条件。 当高级语言的子程序可以工作了,你再把它翻译成汇编代码。 现在你可以开始优化了。 每次你做了点修改都应该运行测试程序看看能不能正确工作。 将你所有的版本都标上号并保存起来,这样在发现测试程

  • 在本章中, 已经讨论了很多种用来解析 input 的方法。 如果格式不对,那这些基本的实现都是抛出异常。 如果数据丢失一部分, FixedLengthTokenizer 也会抛出异常。 同样, 使用 FieldSetMapper 时,如果读取超出 RowMapper 索引范围的值,又或者返回值类型不匹配,都会抛出异常。 所有的异常都会在 read 返回之前抛出。 然而, 他们不能确定返回的item