如何在Python脚本中无控制台输入调用Minicom实现树莓派4串口文件传输?
在Python脚本中实现树莓派串口自动文件传输
当然可以在Python中调用Minicom实现自动传输,不过更推荐直接用Python串口库实现,两种方案如下:
方案一:调用Minicom的非交互模式
Minicom支持通过脚本文件实现无交互操作,步骤如下:
创建Minicom传输脚本
新建一个发送脚本文件(比如send_file.scr),写入以下内容:send /home/pi/your_file.txt # 指定要发送的文件路径 exit # 传输完成后退出Minicom如果是接收端,脚本(
receive_file.scr)可以写:rz # 启动接收模式 exitPython中调用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
相关产品推荐
相关产品推荐

