我试图用python通过RS232控制冷水机组。我坚持按照以下方法生成校验和。
“校验和是两个ASCII十六进制字节,表示从sor开始的命令的所有先前字节总和的最低有效8位。”
本例中的“sor”以字节为单位为“2E”。
- 实施例
例如,PC要求将冷却器模式设置为待机。它将传输以下字节序列。
2E 47 30 4135 0D
请注意,2Eh是标题的开头(“。”),47h是命令(“G”),30h是将模式设置为待机的限定符。 41h和35h是校验和字节,表示“A5”的ASCII十六进制,这是2Eh + 47h + 30h之和的最低有效字节,0Dh是回车。
有谁知道如何生成校验和字节4135?
三江源!!
答案 0 :(得分:1)
您可以在十六进制中找到总和为
>>> hexsum = hex(0x2e + 0x47 + 0x30)[2:].upper()
>>> hexsum
'A5'
(前面的0x
[2:]
关闭>>> bytes = [hex(ord(c))[2:] for c in hexsum]
>>> bytes
['41', '35']
然后您可以将十六进制字符的ASCII值作为
0x
(同样,从每个元素中删除正面>>> checksum = ''.join(bytes)
>>> checksum
'4135'
)
然后你可以sliced他们在一起:
>>> ''.join(hex(ord(c))[2:] for c in hex(0x2e + 0x47 + 0x30)[2:].upper())
'4135'
或者所有事情都可以通过这个单线程来完成:
<?php
$content = file_get_contents('somejsonfile.json');
print_r(json_decode($content));
?>
答案 1 :(得分:0)
函数rs232_checksum
计算字节总和。
然后它将sum转换为大写的十六进制字符串,并返回为字节。
def rs232_checksum(the_bytes):
return bytes('%02X' % (sum(map(ord, the_bytes)) % 256))
checksum_bytes = rs232_checksum(b'\x2e\x47\x30')
函数定义简化为(使用二进制&#34;和&#34;以获得最低有效8位):
def rs232_checksum(the_bytes):
return b'%02X' % (sum(the_bytes) & 0xFF)