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

如何在Python脚本中无控制台输入调用Minicom实现树莓派4串口文件传输?

在Python脚本中实现树莓派串口自动文件传输

当然可以在Python中调用Minicom实现自动传输,不过更推荐直接用Python串口库实现,两种方案如下:

方案一:调用Minicom的非交互模式

Minicom支持通过脚本文件实现无交互操作,步骤如下:

  1. 创建Minicom传输脚本
    新建一个发送脚本文件(比如send_file.scr),写入以下内容:

    send /home/pi/your_file.txt  # 指定要发送的文件路径
    exit  # 传输完成后退出Minicom
    

    如果是接收端,脚本(receive_file.scr)可以写:

    rz  # 启动接收模式
    exit
    
  2. Python中调用Minicom
    使用subprocess模块执行Minicom命令,指定串口参数和脚本:

    import subprocess
    
    # 配置参数
    serial_dev = "/dev/ttyS0"
    baud_rate = 115200
    send_script = "/home/pi/send_file.scr"
    
    # 执行传输
    proc = subprocess.run(
        ["minicom", "-b", str(baud_rate), "-D", serial_dev, "-S", send_script],
        capture_output=True,
        text=True
    )
    
    # 检查结果
    if proc.returncode == 0:
        print("文件传输成功")
    else:
        print(f"传输失败: {proc.stderr}")
    

    注意:需确保两端Minicom已配置好ZMODEM/XMODEM等文件传输协议,且接收端需提前启动接收脚本。

方案二:直接用pyserial实现(更灵活)

不需要依赖Minicom,直接通过Python的pyserial库操作串口,自定义传输逻辑,适合完全自动化场景:

发送端代码

import serial
import os

def serial_send_file(port, baud, file_path):
    ser = serial.Serial(port, baud, timeout=2)
    
    # 发送文件元信息(文件名+大小)
    filename = os.path.basename(file_path)
    filesize = os.path.getsize(file_path)
    ser.write(f"{filename}:{filesize}\n".encode())
    
    # 等待接收端确认
    ack = ser.readline().decode().strip()
    if ack != "READY":
        print("接收端未响应,终止传输")
        ser.close()
        return
    
    # 分块发送文件内容
    with open(file_path, "rb") as f:
        while chunk := f.read(1024):
            ser.write(chunk)
    
    # 发送结束标记
    ser.write(b"TRANS_DONE")
    print("文件发送完成")
    ser.close()

# 调用示例
serial_send_file("/dev/ttyS0", 115200, "/home/pi/test.bin")

接收端代码

import serial
import os

def serial_receive_file(port, baud, save_dir):
    os.makedirs(save_dir, exist_ok=True)
    ser = serial.Serial(port, baud, timeout=5)
    
    # 读取文件元信息
    header = ser.readline().decode().strip()
    if not header:
        print("未收到文件信息")
        ser.close()
        return
    filename, filesize = header.split(":")
    filesize = int(filesize)
    
    # 发送确认信号
    ser.write(b"READY\n")
    
    # 接收文件内容
    recv_size = 0
    save_path = os.path.join(save_dir, filename)
    with open(save_path, "wb") as f:
        while recv_size < filesize:
            chunk = ser.read(min(1024, filesize - recv_size))
            if not chunk:
                print("接收超时,传输中断")
                ser.close()
                return
            f.write(chunk)
            recv_size += len(chunk)
    
    # 验证结束标记
    end_mark = ser.read(9).decode()
    if end_mark == "TRANS_DONE":
        print(f"文件 {filename} 接收完成,大小 {filesize} 字节")
    else:
        print("文件接收不完整")
    ser.close()

# 调用示例
serial_receive_file("/dev/ttyS0", 115200, "/home/pi/received_files")

使用前需先安装pyserial:pip install pyserial

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 14:52:40