> Il giorno 16 feb 2022, alle ore 06:53, Vinny Mautone <vinny74...@gmail.com> 
> ha scritto:
> 
> 
> Ciao a tutti sto provando a leggere dei dati da un apparecchiatura con la 
> quale comunico tramite il protocollo modbus, sto usando il modulo 
> pymodbusTCP, ho alcuni dati come ad esempio la versione del firmware che 
> occupano sei registri da 16 bit, riesco a leggerli e con la funzione di 
> lettura del modulo ottengo una lista di 6 elementi da 16bit, solo che non 
> riesco a scomporre e a recuperare l'informazione in modo leggibile, dal 
> manuale leggo che il dato è formato da 11 byte in caratteri ascii, quindo ho 
> capito che devo scomporre ogni elemento della lista nei due byte che lo 
> compongono e poi riassemblare il tutto.
> 
> 
Dall’esempio postato successivamente provo a spiegartelo meglio:

>>> reg=[21070,12601,12340,12593,12593,13312]

Per prima cosa dobbiamo trasformare nel relativo esadecimale usando la funzione 
hex 

>>> [hex(c) for c in reg]
['0x524e', '0x3139', '0x3034', '0x3131', '0x3131', '0x3400']
B
Ora vogliamo ottenere un unica stringa che rappresenti il valore esadecimale
e per questo dobbiamo fare una join ma eliminando ‘0x’ all’inizio. 
Scriviamo quindi:

>>> ''.join([hex(c)[2:] for c in reg])
'524e31393034313131313400'


Ora trasformiamo in un array di byte:

>>> bytearray.fromhex(''.join([hex(c)[2:] for c in reg]))
bytearray(b'RN190411114\x00')

E infine con decode() otteniamo la rappresentazione:

>>> bytearray.fromhex(''.join([hex(c)[2:] for c in reg])).decode()
'RN190411114\x00'

Per eliminare il char(0) finale possiamo rimpiazzare con
stringa vuota:

>>> bytearray.fromhex(''.join([hex(c)[2:] for c in 
>>> reg])).decode().replace(chr(0),'')
'RN190411114'

Ciao

G






_______________________________________________
Python mailing list
Python@lists.python.it
https://lists.python.it/mailman/listinfo/python

Reply via email to