#!/bin/python # http://stackoverflow.com/questions/28867795/reading-i2c-data-from-gps/31010266 import time import json import smbus import logging BUS = None address = 0x42 gpsReadInterval = 0.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): global lastLocation gpsChars = ''.join(chr(c) for c in gpsLine) if "*" not in gpsChars: 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)) def readGPS(): c = None response = [] try: while True: # Newline, or bad char. c = BUS.read_byte(address) if c == 255: return False elif c == 10: break else: response.append(c) parseResponse(response) except IOError: time.sleep(0.5) connectBus() except (Exception) as e: print(e) LOG.error(e) connectBus() while True: readGPS() time.sleep(gpsReadInterval)