2017-07-11 36 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可打印字符和轉義十六進制值的混合體)。 –