欢迎光临UUpython
最大、最新、最全的Python代码收集站

通过串口收发文件

这段代码实现了使用串口进行文件传输,采用 XMODEM 协议进行文件发送和接收。具体来说,代码包括以下主要功能:

  1. Send_File(filepath, port='COM8', baudrate=115200): 该函数用于将指定路径的文件通过串口发送。它首先构建一个包含文件大小和文件名的指令,并发送该指令。然后通过 XMODEM 协议将文件内容发送到目标设备。
  2. Recv_File(port='COM2', baudrate=115200): 该函数用于在接收端监听指令并执行相应操作。它会不断地等待接收到指令,根据不同指令执行不同操作。对于 AFF 指令,表示开始接收文件,并使用 XMODEM 协议接收文件内容。

主要使用的模块是 serial 用于串口通信,以及 xmodem 用于 XMODEM 协议的实现。

注意事项:

  • 串口的端口号(port)和波特率(baudrate)需要根据实际情况进行配置。
  • 代码中默认使用 XMODEM 协议,可以根据需要选择其他协议。
  • 这段代码实现了基本的文件传输功能,你可以根据实际需求进行扩展和优化,例如添加错误处理、进度显示等。
  • 在实际应用中,需要确保发送端和接收端的协议、参数、文件路径等信息一致。
import serial
from xmodem import XMODEM
import os
 
def Send_File(filepath, port='COM8', baudrate=115200):
    bn = os.path.basename(filepath)
    filesize = os.stat(filepath).st_size
    strSendFileCMD = "AFF_" + str(filesize) + "_" + bn + "\n"
    # 打开串口
    ser = serial.Serial(port, baudrate)
     
    # 定义YMODEM发送函数
    def send_ymodem(filename):
        def getc(size, timeout=1):
            return ser.read(size)
        def putc(data, timeout=1):
            return ser.write(data)
        modem = XMODEM(getc, putc)
        with open(filename, "rb") as f:
            status = modem.send(f)
        return status
     
    # 发送指令
    ser.write(strSendFileCMD.encode())
    # 发送文件
    status = send_ymodem(filepath)
    if status:
        print(f"文件发送成功:{filepath}")
    else:
        print(f"文件发送失败:{filepath}")
    # 关闭串口
    ser.close()
 
 
def Recv_File(port='COM2', baudrate=115200):
    # 打开串口
    ser = serial.Serial(port, baudrate)
     
    # 定义YMODEM接收函数
    def recv_ymodem(filename):
        def getc(size, timeout=1):
            return ser.read(size) or None
        def putc(data, timeout=1):
            return ser.write(data)
        modem = XMODEM(getc, putc)
        with open(filename, "wb") as f:
            status = modem.recv(f)
        return status
     
    # 循环监听指令
    while True:
        # 接收指令
        print("等待接收指令")
        strCMD = ser.read_until().strip().decode()
        print(strCMD)
        cmdlist = strCMD.split("_")
        cmd = cmdlist[0]
        filesize = cmdlist[1]
        filename = cmdlist[2]
        if cmd == "AFF":
            # 收到指令后开始接收文件
            print("开始接收文件")
            # 接收文件并保存
            status = recv_ymodem(filename)
            if status:
                print(f"文件接收成功:{filename}")
            else:
                print(f"文件接收失败:{filename}")
            # 继续监听指令
            continue
        # 其他指令
        print(f"收到指令:{cmd}")
    # 关闭串口
    ser.close()
 
if __name__=="__main__":
    Send_File("D:/users.7z") #发送文件
    #Recv_File() #接收文件
赞(0) 打赏
未经允许不得转载:UUpython » 通过串口收发文件
分享到: 更多 (0)

评论 抢沙发

评论前必须登录!