gps.py can avoid ascii errors on parsing i2c byte data

This commit is contained in:
Bachir Soussi Chiadmi
2016-06-11 08:45:18 +00:00
parent ed3aa04175
commit c5b86e3ba3
+26 -42
View File
@@ -1,64 +1,42 @@
#!/bin/python
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# http://stackoverflow.com/questions/28867795/reading-i2c-data-from-gps/31010266
import time
import json
import smbus
import logging
import pynmea2
BUS = None
address = 0x42
gpsReadInterval = 0.1
gpsReadInterval = 1
LOG = logging.getLogger()
# GUIDE
# http://ava.upuaut.net/?p=768
GPSDAT = {
'strType': None,
'fixTime': None,
'lat': None,
'latDir': None,
'lon': None,
'lonDir': None,
'fixQual': None,
'numSat': None,
'horDil': None,
'alt': None,
'altUnit': None,
'galt': None,
'galtUnit': None,
'DPGS_updt': None,
'DPGS_ID': None
}
def connectBus():
global BUS
BUS = smbus.SMBus(1)
def parseResponse(gpsLine):
def parseResponse(gpsBytes):
global lastLocation
gpsChars = ''.join(chr(c) for c in gpsLine)
if "*" not in gpsChars:
#gpsLine = "".join(map(chr, gpsBytes))
#gpsLine = "".join([chr(byte) for byte in gpsBytes])
gpsLine = "".join([chr(byte) for byte in gpsBytes])
if "*" not in gpsLine:
return False
gpsStr, chkSum = gpsChars.split('*')
gpsComponents = gpsStr.split(',')
gpsStart = gpsComponents[0]
if (gpsStart == "$GNGGA"):
chkVal = 0
for ch in gpsStr[1:]: # Remove the $
chkVal ^= ord(ch)
if (chkVal == int(chkSum, 16)):
for i, k in enumerate(
['strType', 'fixTime',
'lat', 'latDir', 'lon', 'lonDir',
'fixQual', 'numSat', 'horDil',
'alt', 'altUnit', 'galt', 'galtUnit',
'DPGS_updt', 'DPGS_ID']):
GPSDAT[k] = gpsComponents[i]
print(gpsChars)
print(json.dumps(GPSDAT, indent=2))
print(gpsLine)
gpsObject = pynmea2.parse(gpsLine)
print(gpsObject)
# logs
lt = time.asctime( time.localtime(time.time()) )
with open('/home/alarm/gps.log', 'a') as f:
f.write(lt+' : '+gpsLine+'\n')
def readGPS():
c = None
@@ -71,12 +49,17 @@ def readGPS():
elif c == 10:
break
else:
#print(c)
response.append(c)
parseResponse(response)
except IOError:
time.sleep(0.5)
connectBus()
except (Exception) as e:
print("Exception")
print(e)
LOG.error(e)
@@ -84,3 +67,4 @@ connectBus()
while True:
readGPS()
time.sleep(gpsReadInterval)
#readGPS()