从 GPS 读取 I2C 数据

Reading I2C data from GPS

我有一个 ublox M8 GPS 通过 I2C 连接到我的 Raspberry Pi,我正在尝试从中提取数据。

我正在使用 python 尝试通过与 GPS 模块的 I2C 连接获取数据,但每次请求我都会返回一个递增的数字。

我不确定我做错了什么。

i2cdetect -y 1 returns:

     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:          -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: -- -- 42 -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --

Python代码

import smbus
import time
bus = smbus.SMBus(1)
address = 0x42
bus.read_byte_data(address,0x00)
bus.read_byte(address)

returns:

160
161

我也在试验这个。

  1. 使用此 page 中关于如何使用 smbus 的一些信息。
  2. 并使用 here 中的 arduino 代码(注意下面未使用 0xfd 和 0xff 字节)

我可以得到下面的 GNGGA 字符串($GNGGA 表示同时使用美国和俄罗斯的 GPS 系统):

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, e:
        print e
        LOG.error(e)

connectBus()
while True:
    readGPS()
    time.sleep(gpsReadInterval)

这是一些输出。

$GNGGA,,,,,,0,00,99.99,,,,,,*56
{
  "galt": "", 
  "DPGS_updt": "", 
  "lon": "", 
  "strType": "$GNGGA", 
  "lat": "", 
  "alt": "", 
  "fixTime": "", 
  "lonDir": "", 
  "numSat": "00", 
  "fixQual": "0", 
  "altUnit": "", 
  "galtUnit": "", 
  "horDil": "99.99", 
  "latDir": "", 
  "DPGS_ID": ""
}

我把它放在远离 windows 的室内,等等。预计会有如此糟糕的数据。 希望这有帮助。