如何通过PyBoard与MicroPython实现双外置硬盘的高效直接数据传输
优雅实现PyBoard双外置硬盘数据传输的MicroPython方案
嘿,我来给你分享一套在PyBoard上高效传输双外置硬盘数据的方案——正好之前做过类似需求,分块流式读写绝对是最优解,既省内存又稳定,完全符合你要的「优雅」要求~
一、先搞定硬件连接
首先得确保硬件层面没问题:
- 你的PyBoard得支持USB主机模式(比如PyBoard v1.1、PyBoard D这些主流型号都支持),要接两个硬盘的话,必须用带外接供电的USB HUB——毕竟硬盘耗电不算小,PyBoard自身的供电大概率带不动俩硬盘,别省这个钱!
- 硬盘最好格式化为FAT32格式,MicroPython对它的兼容性最好;如果用exFAT的话,后面得装额外模块,先优先用FAT32踩坑更少。
二、核心方案:分块流式读写
你肯定知道直接把大文件读进内存不现实(PyBoard内存就那么点),所以最优解就是分块流式传输——读一块就写一块,全程不用把整个文件塞进内存,这才是高效又优雅的姿势。
具体实现思路
- 把两个硬盘挂载到不同的路径(比如
/sd1当源盘,/sd2当目标盘,具体路径看PyBoard识别后的挂载情况) - 递归遍历源盘的目录结构,在目标盘同步创建目录
- 对每个文件,用固定大小的缓冲区分块读写,直到传输完成
直接可用的代码示例
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
相关产品推荐
相关产品推荐

