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

如何通过PyBoard与MicroPython实现双外置硬盘的高效直接数据传输

优雅实现PyBoard双外置硬盘数据传输的MicroPython方案

嘿,我来给你分享一套在PyBoard上高效传输双外置硬盘数据的方案——正好之前做过类似需求,分块流式读写绝对是最优解,既省内存又稳定,完全符合你要的「优雅」要求~

一、先搞定硬件连接

首先得确保硬件层面没问题:

  • 你的PyBoard得支持USB主机模式(比如PyBoard v1.1、PyBoard D这些主流型号都支持),要接两个硬盘的话,必须用带外接供电的USB HUB——毕竟硬盘耗电不算小,PyBoard自身的供电大概率带不动俩硬盘,别省这个钱!
  • 硬盘最好格式化为FAT32格式,MicroPython对它的兼容性最好;如果用exFAT的话,后面得装额外模块,先优先用FAT32踩坑更少。

二、核心方案:分块流式读写

你肯定知道直接把大文件读进内存不现实(PyBoard内存就那么点),所以最优解就是分块流式传输——读一块就写一块,全程不用把整个文件塞进内存,这才是高效又优雅的姿势。

具体实现思路

  1. 把两个硬盘挂载到不同的路径(比如/sd1当源盘,/sd2当目标盘,具体路径看PyBoard识别后的挂载情况)
  2. 递归遍历源盘的目录结构,在目标盘同步创建目录
  3. 对每个文件,用固定大小的缓冲区分块读写,直到传输完成

直接可用的代码示例

import os
from machine import USBHost

# 初始化USB主机(部分PyBoard型号需要手动触发,有些会自动识别)
usb_host = USBHost()

# 源盘和目标盘的挂载路径,根据实际情况修改!
SOURCE_DIR = '/sd1'
TARGET_DIR = '/sd2'

# 缓冲区大小,建议根据PyBoard内存调整:内存小用4KB/8KB,内存大可以拉到32KB
BUFFER_SIZE = 8192

def copy_single_file(src_path, dst_path):
    """分块复制单个文件,避免内存溢出"""
    try:
        # 用with语句自动管理文件句柄,不用手动close
        with open(src_path, 'rb') as src_file, open(dst_path, 'wb') as dst_file:
            while True:
                # 读一块数据
                chunk = src_file.read(BUFFER_SIZE)
                if not chunk:
                    break  # 读完了就退出循环
                dst_file.write(chunk)
        print(f✅ 复制完成: {src_path} → {dst_path}")
    except Exception as e:
        print(f❌ 复制失败 {src_path}: {str(e)}")

def copy_directory_recursive(src_dir, dst_dir):
    """递归复制整个目录结构,包括子目录和文件"""
    # 先创建目标目录,已存在就跳过
    try:
        os.mkdir(dst_dir)
        print(f📂 创建目录: {dst_dir}")
    except OSError:
        pass  # 目录已存在,不用管

    # 遍历源目录下的所有条目
    for entry in os.ilistdir(src_dir):
        entry_name, entry_type = entry[0], entry[1]
        full_src_path = f"{src_dir}/{entry_name}"
        full_dst_path = f"{dst_dir}/{entry_name}"

        if entry_type == 0x4000:  # 这是一个目录
            copy_directory_recursive(full_src_path, full_dst_path)
        elif entry_type == 0x8000:  # 这是一个文件
            copy_single_file(full_src_path, full_dst_path)

if __name__ == '__main__':
    # 先检查源目录是否存在,避免白忙活
    if not os.path.exists(SOURCE_DIR):
        print(f⚠️ 源目录 {SOURCE_DIR} 不存在,请检查硬盘连接!")
    else:
        print("🚀 开始数据传输...")
        copy_directory_recursive(SOURCE_DIR, TARGET_DIR)
        print("🎉 所有数据传输完成!")

三、进阶优化技巧,让传输更丝滑

  • 缓冲区调优:如果你的PyBoard内存够大(比如PyBoard D有1MB以上可用内存),可以把BUFFER_SIZE调到32KB甚至64KB,能明显提升传输速度;内存小的话就老实用8KB,别贪大。
  • 进度提示:可以给单文件传输加个进度条——先读文件总大小,每传一块就计算已传比例,用print实时输出,这样能知道传输进度。
  • 错误重试:如果传输中偶尔出现IO错误,可以给copy_single_file加个重试逻辑(比如重试3次),避免因为一次小问题就中断整个任务。
  • 数据校验:传输完可以用hashlib模块计算文件的MD5或CRC值,和源文件比对,确保数据100%准确。
  • exFAT支持:如果硬盘是exFAT格式,先通过upip安装模块:upip install micropython-exfatfs,然后在代码里导入exfatfs来挂载硬盘就行。

四、常见坑点排查

  • 硬盘挂载失败:检查USB HUB的供电是否插好,硬盘是不是FAT32格式,PyBoard的USB主机模式有没有开启(有些型号需要在boot.py里配置)。
  • 传输速度慢:除了调大缓冲区,还要确保用的是USB3.0的HUB和硬盘(如果PyBoard支持的话),别在传输的时候跑其他占用IO的任务。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 07:50:26