Raspberry Pi 4与Pico UART通信仅收到print输出异常问题咨询
故障根因定位
- 你当前树莓派4端使用的
/dev/ttyACM0是Pico通过USB线模拟的CDC虚拟串口,并非硬件UART接口的设备。Pico的MicroPython默认会把print()的输出重定向到这个USB虚拟串口,所以删除print(str(temp))后自然就读不到数据。 - 多余空行的问题:
print()语句默认会在输出内容末尾自动添加\n换行符,树莓派端的print(temperature)又会额外追加一次换行,两次换行叠加就出现了多余空行。 - 你修改
uart.write()内容不生效、删除uart.write()后传输异常的核心原因是:当前你完全没有用到硬件UART的传输链路,既没有把Pico的UART0 TX/RX引脚和树莓派4的UART RX/TX引脚物理连接,也没有在树莓派端读取硬件UART的设备节点,uart.write()的内容根本没有传到树莓派上,你之前读到的所有数据都来自print()输出到USB虚拟串口的内容。 - 额外编码错误:树莓派端代码中
str(data).encode("utf-8")逻辑完全错误,ser.readline()返回的本身就是字节串,转成字符串后再编码只会得到b'xxx'格式的异常内容。
解决方案
你可以根据自己的需求选择两种通信方案:
方案1:继续使用USB虚拟串口通信(无需额外接线)
仅靠USB线就能完成传输,不需要接UART引脚,修改代码即可:
- Pico端代码修改(删除无用的UART操作,不需要额外配置):
import os import utime from machine import ADC temp_sensor = ADC(4) # 温度传感器默认连接 def temperature(): raw_sensor_data = temp_sensor.read_u16() sensor_voltage = (raw_sensor_data / 65535)*3.3 return 27. - (sensor_voltage - 0.706)/0.001721 print("OS Name : ",os.uname()) utime.sleep(3) while True: temp = temperature() print(str(temp)) utime.sleep(1)
- 树莓派4端代码修改(修正编码逻辑,去掉多余换行):
import serial import time ser = serial.Serial('/dev/ttyACM0', 9600, timeout=1) time.sleep(1) while True: data = ser.readline() if data: # 字节串转UTF-8字符串,同时去除首尾空白符和换行 temperature = data.decode('utf-8').strip() print(f"Pico核心温度:{temperature} 摄氏度")
方案2:使用硬件UART实现通信(需要物理接线)
如果你需要走独立的UART链路传输,按以下步骤操作:
- 硬件接线:
- Pico UART0 TX引脚(GPIO0,物理引脚1)→ 树莓派4 UART RX引脚(GPIO15,物理引脚10)
- Pico UART0 RX引脚(GPIO1,物理引脚2)→ 树莓派4 UART TX引脚(GPIO14,物理引脚8)
- 两个设备的GND必须共地
- Pico端代码修改(关闭REPL对UART0的占用,避免print输出干扰):
import utime from machine import ADC, UART, Pin import sys # 关闭REPL输出到UART0 sys.stdout = sys.stderr = open('/dev/null', 'w') # 初始化UART0,明确指定引脚 uart = UART(0, baudrate=9600, tx=Pin(0), rx=Pin(1)) temp_sensor = ADC(4) def get_temperature(): raw_sensor_data = temp_sensor.read_u16() sensor_voltage = (raw_sensor_data / 65535)*3.3 return 27. - (sensor_voltage - 0.706)/0.001721 utime.sleep(3) while True: temp = get_temperature() # 写入时加换行符,方便树莓派端用readline读取 uart.write(f"{temp}\n") utime.sleep(1)
- 树莓派端配置修改:
先执行sudo raspi-config,进入「Interface Options」→「Serial Port」,关闭串口登录功能,开启硬件串口,重启设备生效。 - 树莓派端代码修改(切换为硬件UART设备节点):
import serial ser = serial.Serial('/dev/ttyAMA0', 9600, timeout=1) while True: data = ser.readline() if data: temperature = data.decode('utf-8').strip() print(f"Pico核心温度:{temperature} 摄氏度")
内容的提问来源于stack exchange,提问作者merit_2
相关产品推荐
相关产品推荐

