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)
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)
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"
)