吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 3118|回复: 34
收起左侧

[Python 原创] Python通过串口收发文件

  [复制链接]
xiaomingtt 发表于 2023-4-24 10:13
单位内外网是隔离的,USB对拷线被禁用,安全优盘使用太费事,就想到了通过串口传输文件.
[Python] 纯文本查看 复制代码
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() #接收文件

上面是简单的文件传输代码.
我目前内外网传输最多的就是截图,内网通过串口给外网发送指令,外网根据指令截图,然后自动传回内网,不用切换电脑,不用插拔优盘,确实方便.

免费评分

参与人数 5吾爱币 +9 热心值 +5 收起 理由
wushaominkk + 7 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
lgh978 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
kuangxiao + 1 + 1 谢谢@Thanks!
blindcat + 1 + 1 谢谢@Thanks!
zcchk135820 + 1 我很赞同!

查看全部评分

本帖被以下淘专辑推荐:

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

 楼主| xiaomingtt 发表于 2023-4-24 15:26
狐白本白 发表于 2023-4-24 15:09
没理解怎么用 需要内外网同事执行吗 两台电脑需要在同一网段下吗
使用的话我需要改东那些地方 麻烦楼主告 ...

跟网络没有关系,数据传输走的是串口.具体使用方法:内网网电脑都安装Python,最好同一版本,不同版本不知行不行.外网电脑运行pip install xmodem安全文件传输库.,然后运行pip freeze>C:\pip.txt和pip download -d C:\offline -r C:\pip.txt两个命令,将生成的C:\pip.txt文件和C:\offline文件夹复制到内网C盘.内网电脑运行pip install --no-index --find-links=C:\offline -r C:\pip.txt安装相关库.将两台电脑的串口通过交叉线连接.或者找两根杜邦线将两个串口的引脚2和引脚3交叉连接.确定两台电脑的串口号.需要发送文件电脑代码最后一行改为Send_File("D:/users.7z","COM1"),第一个参数是待发送文件,第二个参数是串口号,需要接收文件的电脑最后一行改为Recv_File('COM1').现在接收端运行代码,然后在发送端运行代码,不出意外的话就可以了.
shaunkelly 发表于 2023-4-24 10:22
Gxiaojia 发表于 2023-4-24 10:32
串口发送文件 ,,,   get新思路了 确实很多地方 USB禁止了
KSPprince 发表于 2023-4-24 11:01
接收端用什么设备,两台电脑直连吗
w759003376 发表于 2023-4-24 12:48
KSPprince 发表于 2023-4-24 11:01
接收端用什么设备,两台电脑直连吗

看代码,收和接都在里面,分开用就行
玟篠 发表于 2023-4-24 13:15
学习一下,刚好学了python
wyjtpp 发表于 2023-4-24 13:50
还能有这样的操作,老铁666啊
KSPprince 发表于 2023-4-24 14:12
w759003376 发表于 2023-4-24 12:48
看代码,收和接都在里面,分开用就行

厉害厉害
Foticing 发表于 2023-4-24 15:04
115200的波特率,传输速度只有14KB/S
狐白本白 发表于 2023-4-24 15:09
本帖最后由 狐白本白 于 2023-4-24 15:11 编辑

没理解怎么用 需要内外网同事执行吗 两台电脑需要在同一网段下吗
使用的话我需要改东那些地方 麻烦楼主告知
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-25 00:10

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表