Raspberry Pi Pico与Pi 4 USB串口通信故障排查求助
Raspberry Pi Pico H USB串口传输数据故障排查与替代方案
问题背景
使用2021款Raspberry Pi Pico H(MicroPython 1.22.2)通过USB连接Raspberry Pi 4(Python 3.11)传输温湿度数据,Pico可正常读取传感器数据,但串口传输时频繁出现device reports readiness to read but returned no data错误,更换硬件、刷写固件后问题依旧。
核心排查点及修复步骤
1. 波特率兼容性调整
你在Pi4代码中使用了19600这个非常规波特率,而Pico的USB CDC串口为自适应波特率设计,标准波特率(如115200、9600)兼容性更强。修改Pi4代码中的波特率参数:
ser = serial.Serial('/dev/ttyACM0', 115200, timeout=2)
2. Pico端强制刷新输出缓冲区
MicroPython的USB CDC输出默认会缓冲数据,无法实时发送。在Pico代码中加入缓冲区刷新操作:
import time import sys while True: print('hello') sys.stdout.flush() # 强制刷新输出缓冲区 time.sleep(1)
3. 解决Pi4端串口权限与系统占用问题
- 确保当前用户拥有串口访问权限,执行命令后重新登录:
sudo usermod -a -G dialout pi - 检查并停止系统占用
ttyACM0的服务:sudo systemctl stop serial-getty@ttyACM0.service sudo systemctl disable serial-getty@ttyACM0.service
4. 优化Pi4端串口读取逻辑
调整超时时间为合理值,并显式指定串口参数确保兼容性:
import serial ser = serial.Serial( port='/dev/ttyACM0', baudrate=115200, timeout=2, parity=serial.PARITY_NONE, stopbits=serial.STOPBITS_1, bytesize=serial.EIGHTBITS ) ser.flushInput() while True: line = ser.readline() if line: print(line.decode('utf-8').strip())
更可靠的USB数据传输替代方案
如果串口方案仍不稳定,可尝试以下更适配物联网场景的方案:
- MQTT消息传输:在Pi4上搭建本地MQTT broker(如Mosquitto),Pico通过USB以太网或WiFi连接到broker发布温湿度数据,Pi4作为订阅端接收数据,容错性强且支持多设备扩展。
- USB虚拟文件系统:将Pico配置为USB大容量存储设备,把温湿度数据写入Pico的虚拟文件,Pi4直接读取文件,适合非实时批量数据传输。
- Websocket实时传输:在Pi4上搭建简易websocket服务器,Pico通过USB网络连接服务器推送数据,无需依赖串口驱动,兼容性更好。
内容的提问来源于stack exchange,提问作者user23893926
相关产品推荐
相关产品推荐

