我需要使用Python计算这个CRC,以便与Aurora(ABB)太阳能逆变器通信。在
这是文档:http://www.drhack.it/images/PDF/AuroraCommunicationProtocol_4_2.pdf 在最后一页有计算CRC的指令,我需要用python来做。在
我得到的信息是
MESSAGE_GRID_VOLTAGE = bytes.fromhex("023b010000000000")
结果应该是:
循环电流=FF
CRC_H=2C
然后我需要发送完整的CRC信息,如下所示:
^{pr2}$我如何在python中做到这一点呢?谢谢!在
下面是我尝试的代码:
message = "023b010000000000"
BccLo= int ("FF",16)
BccHi= int("FF", 16)
New = int(message, 16)
New = New ^ BccLo
Tmp=New << 4
New=Tmp ^ New
Tmp=New >> 5
BccLo=BccHi
BccHi= New ^ Tmp
Tmp=New << 3
BccLo=BccLo ^ Tmp
Tmp=New >> 4
BccLo=BccLo ^ Tmp
CRC_L = ~BccLo
CRC_H = ~BccHi
根据引用文件,该算法实际上是一个标准的16位CCITT CRC。这可以用Python的标准
crcmod
来计算。在给你:
输出: 023B01000000FF2C
您需要将该算法应用于消息的每个字节。一个稍微复杂的问题是,Aurora PDF文件中给出的算法假设计算是用8位无符号算法执行的。为了在Python中处理这个问题,我们可以使用0xff的位掩码。下面是该代码的一个稍微优化的版本。在
输出
^{pr2}$上面的代码可以工作,但是有更简单的方法来计算crc。如果你需要计算大量的CRC,我们可以用一个表格来加速这个过程。在
正如Wikipedia Cyclic redundancy check文章所提到的,CRC算法通常是用一个十六进制数编码的多项式来指定的。这是一个函数,它使用反向多项式表示。在
为了加快速度,我们可以计算一个表。在
如果愿意,可以打印表并将其粘贴到脚本中,这样就不必每次运行脚本时都计算表。在
相关问题 更多 >
编程相关推荐