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

如何通过SPI在两台Raspberry Pi Pico间传输图像?代码问题排查

两台Raspberry Pi Pico SPI图像传输代码问题排查

发送端代码问题

  • 文件读取变量名错误:with open('image.jpg', "rb") as image: 中,读取文件误用了未定义的f.read(),应改为img = image.read()。
  • SPI引脚配置错误:发送端作为SPI主设备,需指定MOSI引脚用于发送数据,当前错误使用MISO引脚。修正为:spi = busio.SPI(board.SCK, MOSI=board.MOSI)。
  • 缺失异常处理:文件读取、SPI操作未做异常捕获,建议添加try-except块处理IO或通信错误。

修正后的发送端代码(含长度同步逻辑):

import board
import busio
import digitalio
import time

try:
    with open('image.jpg', "rb") as image:
        img = image.read()
        imgbyte = bytearray(img)

    spi = busio.SPI(board.SCK, MOSI=board.MOSI)
    spi.configure(baudrate=5000000, phase=0, polarity=0)

    while not spi.try_lock():
        pass

    cs = digitalio.DigitalInOut(board.D2)
    cs.direction = digitalio.Direction.OUTPUT

    # 先发送文件长度(4字节大端格式)
    cs.value = False
    spi.write(len(imgbyte).to_bytes(4, byteorder='big'))
    cs.value = True
    time.sleep(0.001)

    # 发送图像数据
    cs.value = False
    spi.write(imgbyte)
    cs.value = True

    spi.unlock()
except Exception as e:
    print(f"发送错误: {e}")

接收端代码问题

  • SPI引脚配置错误:接收端作为SPI从设备,需监听主设备的MOSI引脚接收数据,当前错误使用MISO引脚。修正为:spi = busio.SPI(board.SCK, MOSI=board.MOSI)。
  • CS引脚操作错误:接收端CS为输入引脚,不能直接设置cs.value = False,应监听CS电平变化触发接收。
  • 接收数据长度不足:当前仅接收4字节,远小于图像大小,需先接收文件长度再同步接收完整数据。
  • 文件路径拼写错误:"/lmage.jpg"应为"/image.jpg"。
  • 缺失time模块导入:代码使用time.sleep(1)但未导入time模块。
  • 文件打开模式错误:用"a"追加模式会损坏图像,首次接收应使用"wb"写入模式。
  • 接收逻辑不完善:无循环接收完整数据的逻辑,未同步CS时序。

修正后的接收端代码:

import board
import busio
import digitalio
import time

# 接收文件长度(4字节大端格式)
def receive_file_length(spi, cs):
    length_buf = bytearray(4)
    cs.value = False
    spi.readinto(length_buf)
    cs.value = True
    return int.from_bytes(length_buf, byteorder='big')

try:
    spi = busio.SPI(board.SCK, MOSI=board.MOSI)
    spi.configure(baudrate=5000000, phase=0, polarity=0)

    while not spi.try_lock():
        pass

    cs = digitalio.DigitalInOut(board.D2)
    cs.direction = digitalio.Direction.INPUT

    # 等待CS拉低触发接收
    while cs.value:
        time.sleep(0.001)

    # 先接收文件长度
    file_length = receive_file_length(spi, cs)
    # 准备接收完整图像数据
    receiver = bytearray(file_length)
    
    cs.value = False
    spi.readinto(receiver)
    cs.value = True

    spi.unlock()

    with open("/image.jpg", "wb") as image:
        image.write(receiver)
        image.flush()
    print("接收完成")
except Exception as e:
    print(f"接收错误: {e}")

硬件连线要求

  • 主设备(Pico #1)SCK ↔ 从设备(Pico #2)SCK
  • 主设备MOSI ↔ 从设备MOSI
  • 主设备CS(D2)↔ 从设备CS(D2)
  • 两台Pico必须共地

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 03:54:53