329 lines
9.5 KiB
Python
Raw Normal View History

2025-04-10 17:31:33 +08:00
#!/usr/bin/python
# -*- coding: UTF-8 -*-
import sys
import binascii
import os
import sys
import inspect
import serial.tools.list_ports
import time
import random
import struct
import windnd
from tkinter.ttk import *
from tkinter import *
import tkinter as tk
DEFAULT_BAUD='115200'
DEFAULT_PORT='COM5'
SEND_DUMMY = b'\r\n'
SEND_ACK = b'\00\00\00\00\11\11\11\11'
class FatalError(RuntimeError):
def __init__(self, message):
RuntimeError.__init__(self, message)
@staticmethod
def WithResult(message, result):
"""
Return a fatal error object that appends the hex values of
'result' as a string formatted argument.
"""
message += " (result was %s)" % hex(result)
return FatalError(message)
def readInChunks(fileObj, chunkSize=4096):
while 1:
data = fileObj.read(chunkSize)
if not data:
break
yield data
def crc2hex(fileName):
res = 0xFFFFFFFF
res = 0
for line in open(fileName,"rb"):
res = binascii.crc32(line,res)
return '%08x' % (res & 0xffffffff)
def datacrc32(data,lens):
res = 0xFFFFFFFF
res = 0
counter = 0
for d in data:
# print(d.to_bytes(1,byteorder='little'))
res = binascii.crc32(d.to_bytes(1,byteorder='little'),res)
counter = counter+1
if counter == lens:
break
return '%08x' % (res & 0xffffffff)
def unload_packet(packet):
msg_id, msg_size = struct.unpack_from('>HI', packet, 0)
msg_payload = struct.unpack_from('>%dH' % (int(msg_size-6)/2), packet, 6)
return msg_id, msg_size, msg_payload
def get_file(arg):
#open port
ser = serial.Serial(DEFAULT_PORT, DEFAULT_BAUD, bytesize=8, parity='N', stopbits=1, timeout=3)
ser.close()
ser.open()
print("* Target Connected. *")
str_name = os.path.basename(arg)
GET_CMD = b'get d:/'+str_name.encode('utf-8')+b'\r\n'
promt_lens = 10
cmd_lens = len(GET_CMD)
cmd_length=cmd_lens+promt_lens
print("cmd length",cmd_length)
print("cmd length",GET_CMD)
data_packet_len = 1000
packet_size = data_packet_len+20;
localfile = open(arg,mode='rb')
stats = os.stat(arg)
file_size = stats.st_size
print("file_size:",file_size)
pak_count = file_size/data_packet_len
pak_leave = file_size%data_packet_len
print(type(pak_count))
print(int(pak_count))
ser.write(GET_CMD)
#get cmd header ack
s1=ser.read(cmd_length)
print(len(s1))
print(s1)
str_bytes=bytes(128)
str_bytes = str_name.encode('UTF-8')
#send file header
file_hdr = struct.pack('<'+'I128sII',file_size,str_bytes,packet_size,int(pak_count))
ser.write(file_hdr)
print(file_hdr)
print(len(file_hdr))
#get file header ack
ack=ser.read(8)
loop = int(pak_count)+1
#send file data
data_bytes=bytes(1000)
pack_flag = b'\ee\ee\ee\ee'
for i in range(loop):
#print(i)
cur = i+1
if cur > loop:
break
#print(loop)
if cur ==loop:
print("last")
file_data = localfile.read(pak_leave)
print(pak_leave)
data_bytes = file_data
packet_data_size = int(pak_leave)
packet_reserve = b'\00\00'
datacrc = datacrc32(data_bytes,pak_leave)
headcrc=b'\00\00\00\00'
print("calc data crc:",datacrc)
print(type(datacrc))
datacrc_ba= bytearray.fromhex(datacrc)
print(datacrc_ba)
file_hdr = struct.pack('<'+'I4sH2s4s4s1000s',int(i),pack_flag,packet_data_size,packet_reserve,datacrc_ba,headcrc,data_bytes)
print(file_hdr)
#file_hdr = struct.pack('<'+'2I2H2I4096s',int(i),pack_flag,packet_data_size,packet_reserve,111,222,data_bytes)
ser.write(file_hdr)
else:
print("mid data")
file_data = localfile.read(data_packet_len)
print(data_packet_len)
data_bytes = file_data
packet_data_size = int(data_packet_len)
packet_reserve = b'\00\00'
datacrc = datacrc32(data_bytes,data_packet_len)
headcrc=b'\00\00\00\00'
print("calc data crc:",datacrc)
print(type(datacrc))
datacrc_ba= bytearray.fromhex(datacrc)
print(datacrc_ba)
file_hdr = struct.pack('<'+'I4sH2s4s4s1000s',int(i),pack_flag,packet_data_size,packet_reserve,datacrc_ba,headcrc,data_bytes)
print(file_hdr)
#file_hdr = struct.pack('<'+'2I2H2I4096s',int(i),pack_flag,packet_data_size,packet_reserve,111,222,data_bytes)
ser.write(file_hdr)
#get data ack
ack=ser.read(8)
#send file header
print("data over")
def send(arg):
#open port
ser = serial.Serial(DEFAULT_PORT, DEFAULT_BAUD, bytesize=8, parity='N', stopbits=1, timeout=3)
ser.close()
ser.open()
print("* Target Connected. *")
SEND_CMD = b'send d:/'+arg+b'\r\n'
cmd_lens = len(SEND_CMD)
promt_lens = 4
file_pkt_header_lens=140
cmd_length=cmd_lens+promt_lens
print("cmd length",cmd_length)
ser.write(SEND_CMD)
s1=ser.read(cmd_lens+promt_lens+file_pkt_header_lens)
print(len(s1))
print(s1)
print(cmd_length)
print(str(cmd_length))
prot,filesize,file_name,packet_size,filecounter= struct.unpack('<'+str(cmd_length)+'sI128s2I', s1)
print('file_hdr:',prot)
print('filesize:',filesize)
real_file_name = str(file_name,'utf8').strip('\00')
print('file_name:', real_file_name[3:])
print('length of file_name:', len(real_file_name))
print('packet_size:',packet_size)
print('filecounter:',filecounter)
loop = filecounter + 1
data_packet_len = packet_size-20;
localfile = open(real_file_name[3:],mode='wb')
for i in range(loop):
#ack
cur = i+1
if cur > loop:
break
ser.write(SEND_ACK)
s2=ser.read(packet_size)
# print(len(s2))
# print(s2)
#parse
packet_counter,packet_flag,packet_data_size,packet_reserve,data_crc,header_crc,data= struct.unpack('<'+'2I2H2I'+str(data_packet_len)+'s', s2)
print("packet_flag:%08x"%packet_flag)
print("packet_data_size:",packet_data_size)
print("packet_reserve:",packet_reserve)
print("data_crc:%08x"%data_crc)
print("header_crc:%08x"%header_crc)
print("packet_counter:",packet_counter)
real_data_size = packet_data_size -20
if cur ==loop:
print("calc last data crc:",datacrc32(data,filesize%data_packet_len))
localfile.write(data[0:packet_data_size])
else:
print("calc data crc:",datacrc32(data,data_packet_len))
localfile.write(data)
print("***************************")
localfile.flush()
localfile.close()
ser.write(SEND_DUMMY)
time.sleep(1)
print("download finished")
def dele(arg):
#open port
ser = serial.Serial(DEFAULT_PORT, DEFAULT_BAUD, bytesize=8, parity='N', stopbits=1, timeout=3)
ser.close()
ser.open()
DEL_CMD = b'rm d:/'+arg+b'\r\n'
ser.write(DEL_CMD)
time.sleep(3)
print("delete finished")
window = Tk()
window.title("文件浏览器")
window.geometry('640x320')
list1 = Listbox(window,width=80,height=10,selectmode = SINGLE)
list1.place(x=10,y=5,width=500,height=260)
def click_button():
val = list1.get(list1.curselection())
send(val)
btn1 = tk.Button(window, text='下载', command=click_button)
btn1.place(x=520,y=5,width=100,height=30)
lb1 =Label(window, text='上传文件路径:',fg='red')
lb1.place(x=0,y=280,width=100,height=30)
var_str = StringVar()
lb2 =Entry(window,textvariable=var_str,width=80, bd=2)
lb2.place(x=90,y=280,width=420,height=30)
def cd_d():
ser = serial.Serial(DEFAULT_PORT, DEFAULT_BAUD, bytesize=8, parity='N', stopbits=1, timeout=3)
ser.close()
ser.open()
print("* Target Connected. *")
ser.write(b'cd D:\n\r')
s1=ser.read(20)
print(s1)
ser.close()
def ls_dir():
ser = serial.Serial(DEFAULT_PORT, DEFAULT_BAUD, bytesize=8, parity='N', stopbits=1, timeout=3)
ser.close()
ser.open()
print("* Target Connected. *")
ser.write(b'ls\n\r')
s1=ser.read(4096)
print(s1)
s2=s1.split(b'\n\r')
print(s2)
ser.close()
print(s2[6])
for s in s2[5:-2]:
dir_list = s.split(b'\t')[0]
print(dir_list)
list1.insert(0,dir_list)
def click_up_button():
print(var_str.get())
get_file(var_str.get())
list1.delete(0, tk.END)
ls_dir()
btn2 = tk.Button(window, text='上传', command=click_up_button)
btn2.place(x=520,y=280,width=100,height=30)
def click_del_button():
val = list1.get(list1.curselection())
dele(val)
list1.delete(0, tk.END)
ls_dir()
btn3 = tk.Button(window, text='删除', command=click_del_button)
btn3.place(x=520,y=75,width=100,height=30)
def click_fresh_button():
list1.delete(0, tk.END)
ls_dir()
btn4 = tk.Button(window, text='刷新', command=click_fresh_button)
btn4.place(x=520,y=40,width=100,height=30)
def dragged_files(files):
msg = '\n'.join((item.decode('gbk') for item in files))
print("拖拽文件路径:",msg)
var_str.set(msg)
def main():
cd_d()
ls_dir()
windnd.hook_dropfiles(window,func=dragged_files)
window.mainloop()
def _main():
try:
main()
except FatalError as e:
print('\n A fatal error occurred: %s' % e)
sys.exit(2)
if __name__ == '__main__':
_main()