> 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