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

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引脚,修改代码即可:

  1. 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)
  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链路传输,按以下步骤操作:

  1. 硬件接线:
    • Pico UART0 TX引脚(GPIO0,物理引脚1)→ 树莓派4 UART RX引脚(GPIO15,物理引脚10)
    • Pico UART0 RX引脚(GPIO1,物理引脚2)→ 树莓派4 UART TX引脚(GPIO14,物理引脚8)
    • 两个设备的GND必须共地
  2. 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)
  1. 树莓派端配置修改:
    先执行sudo raspi-config,进入「Interface Options」→「Serial Port」,关闭串口登录功能,开启硬件串口,重启设备生效。
  2. 树莓派端代码修改(切换为硬件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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 16:45:02