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
相关产品推荐
相关产品推荐

