un lettore di file derivanti da progetto Zero
-----------------------------
import sys
contatore = 0
#i messaggi UBX-RXM-RAWX hanno classe 2 e id_messaggio 15
with open("02121413.TXT") as f:
while True:
c = f.read(1)
if not c:
break
if (ord(c) == 0xB5):
contatore = contatore + 1
print(str(contatore) +" ########### ")
print("Sync Char 1 " + hex(ord(c)))
c=f.read(1)
if (ord(c) == 0x62):
buffer = []
print("Sync Char 2 " + hex(ord(c)))
########## CLASS ######################
c=f.read(1)
print "Class " + hex(ord(c))
buffer.append(ord(c))
######### MESSAGE #######################
c=f.read(1)
print "Message " + hex(ord(c))
buffer.append(ord(c))
#############P1 ##########################
c=f.read(1)
print "Lunghezza Payload HB " + hex(ord(c))
hb = ord(c)
buffer.append(ord(c))
#############P1 ##########################
c=f.read(1)
print "Lunghezza Payload LB " + hex(ord(c))
lb = ord(c)
buffer.append(ord(c))
###########LUNGHEZZA PAYLOAD ##############
lunghezza = hb+(lb*255)
print "Lunghezza Payload " + str(lunghezza)
#inizia a leggere il payload
if (lunghezza < 1000):
for count in range(1,lunghezza):
c=f.read(1)
#inserisce il payload in un buffer per validarlo
buffer.append(ord(c))
#calcolo del chacksum
# https://gist.github.com/tomazas/3ab51f91cdc418f5704d
#CALCOLA CHECKSUM E STAMPA PAYLOAD
CK_A,CK_B = 0, 0
for i in range(len(buffer)):
print hex(buffer[i])
CK_A = CK_A + buffer[i]
CK_B = CK_B + CK_A
# ensure unsigned byte range
CK_A = CK_A & 0xFF
CK_B = CK_B & 0xFF
print "UBX packet checksum:", ("0x%02X,0x%02X" % (CK_A,CK_B))
#lettura primo checksum
c=f.read(1)
ck_a1 = ord(c)
print "CK_A ric " + hex(ck_a1)
#lettura secondo checksum
c=f.read(1)
ck_b1 = ord(c)
print "CK_B ric " + hex(ck_b1)
if (CK_A == ck_a1):
print "############################VALIDATO############"
print "\n\n\n"
sys.stdin.readline()
Visualizzazione post con etichetta UBX. Mostra tutti i post
Visualizzazione post con etichetta UBX. Mostra tutti i post
giovedì 14 febbraio 2019
martedì 8 agosto 2017
Checksum su pacchetti UBX Ublox
Circa un anno fa avevo riportato il metodo di calcolo del CRC per i pacchetti dei GPS Ublox
Adesso riporto il codice di calcolo in Python
In pratica si procede a scorrere lo stream dei dati fino a raggiungere il pacchetto di sincronia dati definito dai due byte successivi 0xB5-0x62 (oppure in decimanle 181 e 98).
I byte successivi indicano
1 byte = classe pacchetto
1 byte = id pacchetto
2 byte = lunghezza del payload (LSB+MSB)
segue poi il payload della lunghezza calcolata come in precedenza
2 byte di CRC
attenzione: per il calcolo del CRC si devono escludere i primi due byte di sync e gli ultimi due byte di CRC.
il codice in Pyton e' il seguente
-----------------------------------------------------------
# coding=utf-8
with open("c:\Python27\COM.ubx", "rb") as binary_file:
data = binary_file.read()
msg = []
for x in range(0,100):
test = data[x]
if ((data[x] == 181) and (data[x+1] == 98)):
print("Sync Found! B5 62")
msg_cls = data[x+2] #classe
msg_id = data[x+3] #id
msg_len_lsb = data[x+4] #byte meno significativo lunghezza messaggio
msg_len_msb = data[x+5] #byte piu' significativo lunghezza messaggio
len_msb = msg_len_lsb + (msg_len_msb*256)+4 #lunghezza messaggio
for t in range(0,len_msb):
msg.append(data[x+2+t]) # salva il payload
msg_chk1 = data[x+len_msb+2] #estrai i due byte di checksum
msg_chk2 = data[x+len_msb+3]
#calcolo del checksum del payload
CK_A,CK_B = 0, 0
for i in range(len(msg)):
CK_A = CK_A + msg[i]
CK_B = CK_B + CK_A
CK_A = CK_A & 0xFF
CK_B = CK_B & 0xFF
# controlla se il CRC del pacchetto e quello calcolato coincidono
if ((CK_A == msg_chk1) and (CK_B == msg_chk2)):
print("Pacchetto ok")
Adesso riporto il codice di calcolo in Python
![]() |
Esempio di pacchetto UBX |
In pratica si procede a scorrere lo stream dei dati fino a raggiungere il pacchetto di sincronia dati definito dai due byte successivi 0xB5-0x62 (oppure in decimanle 181 e 98).
I byte successivi indicano
1 byte = classe pacchetto
1 byte = id pacchetto
2 byte = lunghezza del payload (LSB+MSB)
segue poi il payload della lunghezza calcolata come in precedenza
2 byte di CRC
attenzione: per il calcolo del CRC si devono escludere i primi due byte di sync e gli ultimi due byte di CRC.
il codice in Pyton e' il seguente
-----------------------------------------------------------
# coding=utf-8
with open("c:\Python27\COM.ubx", "rb") as binary_file:
data = binary_file.read()
msg = []
for x in range(0,100):
test = data[x]
if ((data[x] == 181) and (data[x+1] == 98)):
print("Sync Found! B5 62")
msg_cls = data[x+2] #classe
msg_id = data[x+3] #id
msg_len_lsb = data[x+4] #byte meno significativo lunghezza messaggio
msg_len_msb = data[x+5] #byte piu' significativo lunghezza messaggio
len_msb = msg_len_lsb + (msg_len_msb*256)+4 #lunghezza messaggio
for t in range(0,len_msb):
msg.append(data[x+2+t]) # salva il payload
msg_chk1 = data[x+len_msb+2] #estrai i due byte di checksum
msg_chk2 = data[x+len_msb+3]
#calcolo del checksum del payload
CK_A,CK_B = 0, 0
for i in range(len(msg)):
CK_A = CK_A + msg[i]
CK_B = CK_B + CK_A
CK_A = CK_A & 0xFF
CK_B = CK_B & 0xFF
# controlla se il CRC del pacchetto e quello calcolato coincidono
if ((CK_A == msg_chk1) and (CK_B == msg_chk2)):
print("Pacchetto ok")
Iscriviti a:
Post (Atom)
Physics informed neural network Fukuzono
Visto che puro ML non funziona per le serie tempo di cui mi sto occupando ed le regressioni basate su formule analitiche mostrano dei limiti...

-
In questo post viene indicato come creare uno scatterplot dinamico basato da dati ripresi da un file csv (nel dettaglio il file csv e' c...
-
La scheda ESP32-2432S028R monta un Esp Dev Module con uno schermo TFT a driver ILI9341 di 320x240 pixels 16 bit colore.Il sito di riferiment...
-
Questo post e' a seguito di quanto gia' visto nella precedente prova Lo scopo e' sempre il solito: creare un sistema che permet...