> Il giorno 16 feb 2022, alle ore 06:53, Vinny Mautone <[email protected]>
> 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
[email protected]
https://lists.python.it/mailman/listinfo/python