我需要使用 Python 计算此 CRC,以便与 Aurora (ABB) 太阳能逆变器进行通信。
这是文件:http://www.drhack.it/images/PDF/AuroraCommunicationProtocol_4_2.pdf在最后一页中有计算 CRC 的说明,我需要在 python 中执行此操作。
我收到的消息是
MESSAGE_GRID_VOLTAGE = bytes.fromhex("023b010000000000")
结果应该是:
CRC_L = FF
CRC_H = 2C
然后我需要发送带有 CRC 的完整消息,如下所示:
MESSAGE_GRID_VOLTAGE = bytes.fromhex("023b010000000000ff2c")
我怎样才能在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。这可以用以下公式计算crcmod.
干得好:
import crcmod
# this is a standard CCITT CRC even if it does not look like
# (crcmod applies xorOut to initCrc, so initCrc is in reality 0xffff, not 0)
_CRC_FUNC = crcmod.mkCrcFun(0x11021, initCrc=0, xorOut=0xffff)
data = bytearray.fromhex("023b010000000000")
crc = _CRC_FUNC(data)
data.append(crc & 0xff)
data.append(((crc >> 8) & 0xff))
print (data.hex())
输出:
023b010000000000ff2c
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)