You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Raspberry Pi Pico上如何将L76K GPS的I2C二进制输出转ASCII?

解决Raspberry Pi Pico通过I2C读取L76K GPS模块的NMEA数据问题

问题核心

你直接用readfrom读取的是原始I2C帧数据,并非直接可解析的NMEA字符串。L76K的I2C通信有特定数据包格式,不能直接读取固定长度字节就转成ASCII。那些\x07、\x00类字节是I2C帧的控制/填充字节,不是NMEA内容。

分步解决方案

1. 修正读取逻辑,过滤有效NMEA数据

放弃固定长度读取,改为逐字节拼接并识别NMEA的起止标识(以$开头,\r\n结尾)。修改后的代码如下:

from machine import Pin, I2C
import time

def main() -> None:
    i2c_gps = I2C(0, scl=Pin(21), sda=Pin(20), freq=400000)
    gps_addr = i2c_gps.scan()[0]
    print(f"GPS模块I2C地址: {gps_addr}")
    
    buffer = bytearray()
    while True:
        # 逐字节读取并拼接
        data = i2c_gps.readfrom(gps_addr, 1)
        if data:
            buffer.extend(data)
            # 检测NMEA结束符\r\n
            if len(buffer) >= 2 and buffer[-2:] == b'\r\n':
                # 提取从$开始的有效NMEA片段
                nmea_start_idx = buffer.find(b'$')
                if nmea_start_idx != -1:
                    nmea_str = buffer[nmea_start_idx:-2].decode('ascii')
                    print(nmea_str)
                # 清空缓冲区准备下一条数据
                buffer = bytearray()
        time.sleep_ms(10)

if __name__ == "__main__":
    main()

2. 过滤无效字节

如果仍有非ASCII无效字节干扰,可以在拼接时只保留可打印ASCII字符及换行符:

# 修改字节拼接逻辑
if data:
    byte = data[0]
    # 保留可打印ASCII(32-126)及换行、回车符
    if 32 <= byte <= 126 or byte in (13, 10):
        buffer.extend(data)

3. 确认模块I2C模式

部分L76K模块默认是UART模式,需检查硬件跳线或通过AT指令切换到I2C模式(参考DFRobot官方手册确认操作方式)。

关键提示

  • 嵌入式I2C通信必须遵循模块的协议格式,不能直接读取原始字节转换业务数据。
  • 有效NMEA片段都是ASCII编码,提取正确后用decode('ascii')即可正常转换为字符串。

内容的提问来源于stack exchange,提问作者InWamos

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 04:32:18