如何测试一行数据是否为十六进制?

问题描述

我正在处理GPS数据,通常GPS芯片返回如下一行:

b'$GNGGA,200121.00,5135.19146,N,00523.30483,E,1,05,1.89,-18.7,M,46.2,*55\r\n'

但是,有时芯片会返回“ None”值或像这样的十六进制字符串:

b'\x00\x00\xa6\x13I\x82b\x9a\x82b\xaa\xbab\x82\xb2\xc2b\x8a\xb2R\xba25\n'

我不确定这是否是故意的。我创建了以下python代码:

import machine
import time

mygps=machine.UART(1,baudrate=9600,rx=34,tx=12,timeout =10)
msg = mygps.readline()
index = 0
while index < 3:
    msg = mygps.readline()
    print(msg)
    if msg is not None:
        print(msg.decode('utf-8'))
        time.sleep(1)
        index +=1

我希望代码跳过GPS芯片返回的十六进制行。我的代码通过“不是不是”条件语句处理“无”问题,但是它似乎无法处理GPS芯片返回的十六进制行。每当GPS芯片返回时 十六进制的一行,它在逻辑测试“如果消息不是无”或此后的右行“ print(msg.decode('utf-8'))”中失败

错误仅显示:UnicodeError

对我来说,有两种可能的解决方案:使python代码能够处理十六进制的行,或者进行逻辑测试,并跳过无行和十六进制行。两种解决方案都对我有用,但是我不知道如何解决。

也许熟悉编码解码和十六进制的人可以帮助我解决这个问题。请注意,当我在非常小的微控制器(ESP32)上运行代码时,最好使用python3 / micropython本机库来解决此问题。

解决方法

您需要做的就是将对print()的调用包装在try-except块中:

while index < 3:
    msg = mygps.readline()
    print(msg)
    if msg is not None:
        try:
            print(msg.decode('utf-8'))
        except UnicodeError:
            pass
        time.sleep(1)
        index += 1

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...