Sziasztok.
Egy NMEA-checkert szeretmék pythonban, de paranoid módon, azaz minden lehetséges sentence-hibánál dobja az egész sort.
Eddig perlben és javascriptben tudtam megoldani ezt.
Levadásztam innen-onnan 2 kódot, ezeket egyberaktam, most így fest:
#!/usr/bin/env python
import re
""" Calculate the checksum for NMEA sentence
from a GPS device. An NMEA sentence comprises
a number of comma separated fields followed by
a checksum (in hex) after a "*". An example
of NMEA sentence with a correct checksum (of
0x76) is:
GPGSV,3,3,10,26,37,134,00,29,25,136,00*76"
"""
def check_nmea0183(s):
"""
Check a string to see if it is a valid NMEA 0183 sentence
"""
if s[0] != '$':
print "nem jol kezdodik"
if s[-4] != '*':
print "nem jol vegzodik"
def checksum(sentence):
""" Remove any newlines """
if re.search("\n$", sentence):
sentence = sentence[:-1]
nmeadata,cksum = re.split('\*', sentence)
calc_cksum = 0
for s in nmeadata:
calc_cksum ^= ord(s)
""" Return the nmeadata, the checksum from
sentence, and the calculated checksum
"""
return nmeadata,'0x'+cksum,hex(calc_cksum)
if __name__=='__main__':
""" NMEA sentence with checksum error (3rd field
should be 10 not 20)
"""
line = "$GPGSV,3,3,20,26,37,134,00,20,25,136,00*58\n"
check_nmea0183(line)
""" Get NMEA data and checksums """
data,cksum,calc_cksum = checksum(line)
""" Verify checksum (will report checksum error) """
if cksum != calc_cksum:
print "Error in checksum for: %s" % (data)
print "Checksums are %s and %s" % (cksum,calc_cksum)
else:
print "minden ok: ",(calc_cksum)
A kódban az
if s[-4] != '*':
sorban ezek szerint ha a mondat végén lévő \n jelet nézem, akkor azt a python egyetlen karakterként értelmezi.
Kérdés:
Ezt jól értem?
- 1659 megtekintés
Hozzászólások
\n = 1 karakter
\r\n = 2 karakter
a print "nem jol kezdodik"
-s soroknal tab-ot használsz a tübbinél space-t ezt éredmes lenne egységesíteni.
Nem teljesen ertem a problemat, de igy tudsz tobb sort feldolgozni egyszerre + hibas sor eseten folytatodik a futtatas:
#!/usr/bin/env python
import re
""" Calculate the checksum for NMEA sentence
from a GPS device. An NMEA sentence comprises
a number of comma separated fields followed by
a checksum (in hex) after a "*". An example
of NMEA sentence with a correct checksum (of
0x76) is:
GPGSV,3,3,10,26,37,134,00,29,25,136,00*76"
"""
def check_nmea0183(s):
"""
Check a string to see if it is a valid NMEA 0183 sentence
"""
if s[0] != '$':
print "nem jol kezdodik"
if s[-3] != '*':
print "nem jol vegzodik"
def checksum(sentence):
""" Remove any newlines """
if re.search("\n$", sentence):
sentence = sentence[:-1]
nmeadata,cksum = re.split('\*', sentence)
calc_cksum = 0
for s in nmeadata:
calc_cksum ^= ord(s)
""" Return the nmeadata, the checksum from
sentence, and the calculated checksum
"""
return nmeadata,'0x'+cksum,hex(calc_cksum)
if __name__=='__main__':
""" NMEA sentence with checksum error (3rd field
should be 10 not 20)
"""
lines = "$GPGSV,3,3,20,26,37,134,00,20,25,136,00*58\n$GPGSV,3,3,20,26,37,134,00,20,25,136,00*58\n$GPGSV,3,3,20,26,37,134,00,20,25,136,00*58\nnemjo sor\n"
for line in lines.split("\n"):
if len(line) == 0: # Fajl vegi ures sor
continue
try:
check_nmea0183(line)
""" Get NMEA data and checksums """
data,cksum,calc_cksum = checksum(line)
""" Verify checksum (will report checksum error) """
if cksum != calc_cksum:
print "Error in checksum for: %s" % (data)
print "Checksums are %s and %s" % (cksum,calc_cksum)
else:
print "minden ok: ",(calc_cksum)
except Exception, err:
print "Hibas sor:", line, err
--------
Vultr VPS: SSD + 768MB RAM, 5USD/hó (benchmark), 20USD kupon: SSDVPS
- A hozzászóláshoz be kell jelentkezni
Köszi, akkor 1 karakter.
Space-eket használok, lehet hogy ide rondán írtam (a geany generálta az üres helyeket, megjegyzem, ezt a szokását nem szeretem)..
Akkor még egy paranoid ellenőrzést készítek arra az esetre, ha két mondatot 1 sorba írna. Szóval ellenőrzöm, hogy a sorok meghaladják-e a 80 karaktert.
Több ellenőrzést nem tartok fontosnak, aztán a fene tudja mi jön még. Ez a közvetlen soros portról történő olvasás hátránya. Ha gpsd által olvasnék, nem lennének hibás mondatok, viszont futna az is. Abba egyszer beleástam magam, de nagy részét elfelejtettem, most a pythonnal az elejétől kezdve újraértelmeztem ismereteimet.
---
--- A gond akkor van, ha látszólag minden működik. ---
---
- A hozzászóláshoz be kell jelentkezni
Szerintem ne nezd, hogy hany karakter van egy sorban (legalabbis ellnorzeskent ne). A kovetkezo mondatok valid NMEA mondatok:
$GPVTG,,T,,M,0.037,N,0.068,K,A*29
$GPGGA,,,,,,0,00,99.99,,,,,,*48
Tehat ha, veletlenul osszeernek, akkor is kevesebb lesz mint 80, de ettol meg nem jo. Szoval, lehet, hogy ha tobb mint 80 akkor biztos rossz, de attol meg lehet rossz, hogy kevesebb mint 80.
Azt nem ertem, a kodban miert kell regex keresest hasznalni, szerintem az rstrip() is boven megteszi. Pl.:
if re.search("\n$", sentence):
sentence = sentence[:-1]
helyett eleg lenne egy
sentence = sentence.rstrip("\n")
esetleg:
sentence = sentence.rstrip("\n").rstrip("\r")
/sza2
- A hozzászóláshoz be kell jelentkezni
>>Szoval, lehet, hogy ha tobb mint 80 akkor biztos rossz, de attol meg lehet rossz, hogy kevesebb mint 80.
Ebben igazad van. Azért gondoltam erre, mert az NMEA-doksik mindegyike azt írja, hogy egy sor 80-nál biztosan nem hosszabb.
Rövidebb viszont jócskán lehet, és akkor is lehetnek hibák.
A regexet holnap megnezem..
Köszi a sugallatot!
:)
---
--- A gond akkor van, ha látszólag minden működik. ---
---
- A hozzászóláshoz be kell jelentkezni
Csak a biztonsag kedveert: a 80 karakter a \n es \r nelkul van, tehat ha ezeket nem vagyod le, akkor 82 a max.
/sza2
- A hozzászóláshoz be kell jelentkezni
Módosítottam az eredeti kódon:
#!/usr/bin/env python
import re
eredeti = "$GPGSV,3,3,20,26,37,134,10,20,25,136,00*7d\n"
line = eredeti[1:]
def check_nmea0183(s):
if s[0] != '$':
print "nem jol kezdodik"
if s[-4] != '*':
print "nem jol vegzodik"
def checksum(sentence):
sentence = sentence.rstrip("\n")
nmeadata,cksum = re.split('\*', sentence)
calc_cksum = 0
for s in nmeadata:
calc_cksum ^= ord(s)
""" Return the nmeadata, the checksum from
sentence, and the calculated checksum
"""
return nmeadata,'0x'+cksum,hex(calc_cksum)
if __name__=='__main__':
""" NMEA sentence with checksum error (3rd field
should be 10 not 20)
"""
check_nmea0183(eredeti)
""" Get NMEA data and checksums """
data,cksum,calc_cksum = checksum(line)
""" Verify checksum (will report checksum error) """
if cksum != calc_cksum:
print "Error in checksum for: %s" % (data)
print "Checksums are %s and %s" % (cksum,calc_cksum)
else:
print "minden ok: ",(calc_cksum)
print (data)
Az egyik def. $ jelek nélkül vizsgálja a mondatot, a másik azzal együtt.
Tanulok pitonul egyre csak...
---
--- A gond akkor van, ha látszólag minden működik. ---
---
- A hozzászóláshoz be kell jelentkezni
En inkabb azt latom, hogy az egyik fuggvenyed azt nezi, hogy megvan-e a $ es a *, a masik meg checksum-ot szamol.
Nem ertem viszont a megkozelitesedet. Nekem valami ilyesmi logikusabbnak latszik:
#!/usr/bin/env python
nmea_sentence_ok = "$GPGSV,3,3,20,26,37,134,10,20,25,136,00*7d\r\n"
nmea_sentence_err = "$XPGSV,3,3,20,26,37,134,10,20,25,136,00*7d\r\n"
def check_nmea0183(sentence):
sentence = sentence.rstrip("\n").rstrip("\r")
if sentence[0] != '$':
return False
if sentence[-3] != '*':
return False
sentence = sentence.lstrip("$")
nmeadata, cksum = sentence.split('*')
calc_cksum = 0
for s in nmeadata:
calc_cksum ^= ord(s)
if calc_cksum != int('0x' + cksum, 16):
return False
return True
if check_nmea0183(nmea_sentence_ok):
print("Valid NMEA sentence")
if not check_nmea0183(nmea_sentence_err):
print("Invalid NMEA sentence")
Es ez nem programozasi nyelv fuggo, mas nyelven is fura nekem az amit megvalositottal fentebb.
/sza2
- A hozzászóláshoz be kell jelentkezni
Azért választottam a kettőt külön, mert úgy éreztem, hogy mivel hibás mondatok is érkeznek a soros portról (/dev/ttyAMA0), ellenőrzöm a kezdeti- és végkaraktert. Amikor azzal kísérleteztem, még nem volt python példakódom a checksumra.
A fenti forráskód betudható értelmetlennek is, de közben pythonul tanulok ugye, és a kezdő ezzel megmagyarázza a teljesen értelmetlen dolgokat is.
Holnap újraolvasom amit írtál, most mára már elfáradtam :)
---
--- A gond akkor van, ha látszólag minden működik. ---
---
- A hozzászóláshoz be kell jelentkezni