gps.py can avoid ascii errors on parsing i2c byte data
This commit is contained in:
+26
-42
@@ -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()
|
||||
|
||||
Reference in New Issue
Block a user