首页 > 解决方案 > 带有意外字符的 NMEA 句子

问题描述

我正在使用 python 通过树莓派上的 i2c 从 u-blox NEO-M9N 芯片读取数据。

目前,我还没有构建脚本的其余部分,但我对芯片的输出有点困惑,因为它似乎包含不属于那里的字符,例如 °、¬ 或 Á。有时这些似乎是替换看起来相似的字符:021120 对几行是正确的,然后被 0²1±20 替换,这不是太远。

对于 5 到 50 行之间的任何内容,这些句子可能是正确的,然后我会得到这样的东西(我已经用 X 替换了部分 GPS 坐标,但你明白了):

$GNRMC,204107.00,A,XX.20¶46,N,XX.47371,E,0.844,,021±20,,,A,V*17
$GNRMC,204108.00¬A,XX.20603,N,XX.47454,E,0.921,,021120,,,A,V*1B

知道这可能是什么原因吗?我很确定这会弄乱我以后想要的数据......


这是我用来读取数据的代码:

import time
import json
import smbus
import logging 

BUS = None
address = 0x42
gpsReadInterval = 0.1
LOG = logging.getLogger()

# taken and (poorly) adapted from
# http://ava.upuaut.net/?p=768

def connectBus():
    global BUS
    BUS = smbus.SMBus(1)

def parseResponse(gpsLine):
    gpsChars = ''.join(chr(c) for c in gpsLine)
    if "GNRMC" not in gpsChars:
        return False
    
    print(gpsChars)

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()

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

标签: pythongpshardwarenmea

解决方案


对于后代,有人为我解决了这个问题:Fix special characters with most equivalent without map

这确实是一个硬件问题,但可以使用这个人的答案通过软件修复


推荐阅读