2017-07-11 5 views
0

Je dois envoyer une version modifiée d'une commande hexadécimale Airbus (une version modifiée bizarre de Modbus) via RS485 à un périphérique série. La commande que je veux envoyer est 0x8181521500005315. Je suis en mesure d'envoyer avec succès la commande comme littérale sous la forme:Conversion d'un int en octets pour une communication série

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

mais je voudrais convertir en quelque sorte une variable int dans le même format.

Voici ce que j'ai jusqu'à présent:

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

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

ser.write(msg) 

La chose étrange est que msg devient:

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

Toute aide est grandement appréciée!

+0

Quelle est votre 'valeur param'? Et que fait la fonction 'genECC()'? – JohanL

+0

Si vous remplacez "R" par son équivalent hexadécimal "\ x52" et "S" par "\ x53", vous verrez que b '\ x81 \ x81R \ x15 \ x00 \ x00S \ x15' est exactement le même que b '\ x81 \ x81 \ x52 \ x15 \ x00 \ x00 \ x53 \ x15'. Cela vous aide-t-il à comprendre ce qui se passe? –

+0

La valeur param et la fonction genECC permettent de créer la variable int. – egemnay

Répondre

0

b '\ x81 \ x81R \ x15 \ x00 \ x00S \ x15' est exactement
b '\ x81 \ x81 \ 52 \ x15 \ x00 \ x00 \ 53 \ x15'

Vous pouvez les obtenir retour et la force avec le module struct:

>>> 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

ou vous pouvez utiliser le 'to_bytes 'intégré comme OP a fait dans sa question et ne pas déranger avec' struct'. Je pense que OP a déjà fait ce qu'il voulait faire, mais n'a pas compris comment Python affichait la valeur retournée (un mélange de caractères imprimables ASCII et de valeurs hexadécimales échappées). –