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)
Debugger integrato ESP32S3
Aggiornamento In realta' il Jtag USB funziona anche sui moduli cinesi Il problema risiede nell'ID USB della porta Jtag. Nel modulo...
-
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...