2017-07-11 37 views
0

我需要通过RS485将空中巴士(一种奇怪的修改版本的Modbus)十六进制命令的修改版本发送到串行设备。我想发送的命令是0x8181521500005315。我能够成功地发送命令作为文字的形式:将int转换为用于串行通信的字节

b'\x81\x81\x15\x21\x00\x00\x53\x15' 

但我想以某种方式将int变量转换为相同的格式。

这是我到目前为止有:

def advancedWriteR(param): 
command = (0x818152*0x10000000000 + param*0x100000000 + genECC('r', param)) 

msg =command.to_bytes(8, byteorder='big') 

ser.write(msg) 

奇怪的是,味精变成:

b'\x81\x81R\x15\x00\x00S\x15' 

任何帮助,不胜感激!

+0

你的'param'值是多少? genECC()函数做了什么? – JohanL

+0

如果用“\ x52”和“S”替换“R”为“\ x53”,那么你会发现b'\ x81 \ x81R \ x15 \ x00 \ x00S \ x15'与b '\ X81 \ X81 \ X52 \ X15 \ X00 \ X00 \ X53 \ X15'。这有助于你了解发生了什么吗? –

+0

参数值和genECC函数用于创建int变量。 – egemnay

回答

0

B '\ X81 \ x81R \ X15 \ X00 \ x00S \ X15' 正是
B '\ X81 \ X81 \ 52 \ X15 \ X00 \ X00 \ 53 \ X15'

你可以让他们用结构模块:

>>> import struct 
>>> struct.pack('>Q', 0x8181521500005315) 
b'\x81\x81R\x15\x00\x00S\x15' 
>>> struct.unpack('>Q', b'\x81\x81R\x15\x00\x00S\x15') 
(9331830153036190485,) 
>>> '0x{:x}'.format(9331830153036190485) 
'0x8181521500005315' 
+0

,或者你可以使用内建的'to_bytes'作为OP在他的问题中做的事情,而不用'struct'打扰。我认为OP已经做了他想做的事情,但不明白Python如何显示返回值(ASCII可打印字符和转义十六进制值的混合体)。 –