python 串列埠除錯小工具
阿新 • • 發佈:2018-12-06
import serial.tools.list_ports import serial from tkinter import Tk,StringVar,Label,Button,Listbox,Text,END import time import datetime import re import threading import json global serial_com port_list = list(serial.tools.list_ports.comports())#讀串列埠 print(port_list) serial_com=[] if len(port_list) <= 0: print( "The Serial port can't find!") else: x=len(port_list) for i in range(x): port_list_0 =list(port_list[i]) print(port_list_0[0]) serial_com.append(port_list_0[0]) print(serial_com) def thread_recv():#接收資料顯示資料 while True: for i in range(20): time_data=datetime.datetime.now() read = ser.readall() if len(read)>0: hexShow(read,time_data) if on_hit==False: break if on_hit == False: break data_text1.delete(1.0,END) def freshen():#重新整理串列埠 global serial_com lis.delete(END,) port_list = list(serial.tools.list_ports.comports())# 讀串列埠 serial_com = [] print(port_list) if len(port_list) <= 0: print("The Serial port can't find!") else: x = len(port_list) for i in range(x): port_list_0 = list(port_list[i]) print(port_list_0[0]) serial_com.append(port_list_0[0]) print('埠',serial_com) var2.set(tuple(serial_com)) def print_selection(): #選擇串列埠 global value,serial_com value=lis.get(lis.curselection()) var1.set(value) print(serial_com[lis.curselection()[0]]) data1 = open("dump.txt", "r") data2 = json.load(data1) data1.close() data_text2.delete(1.0,END) data_text2.insert(1.0,data2) on_hit =False def open_serial(): global on_hit,var3,ser,value src = data_text2.get(1.0, END).strip().replace('\n', '').encode() src1=bytes(src).decode('ascii') print(src1) time.sleep(0.1) data=open("dump.txt","w") json.dump(src1,data) data.close() print(1) if on_hit == False: print("port",value) print(src1) ser = serial.Serial( # 下面這些引數根據情況修改 port=value, baudrate=int(src1), parity=serial.PARITY_NONE, timeout=0.23, stopbits=serial.STOPBITS_ONE, bytesize=serial.EIGHTBITS) print("串列埠開啟") var3.set('關閉串列埠') on_hit=True recv_data=threading.Thread(target=thread_recv) recv_data.start() else: on_hit=False ser.close() var3.set("開啟串列埠") print("串列埠關閉") def hexShow(argv,time_data):#接收資料格式調整 result = '' hlen = len(argv) for i in range(hlen): hvol = argv[i] hhex = hex(hvol)[2:] result += hhex.upper() + ' ' result="%s:"%time_data+result data_text1.insert(1.0,result+'\n') def get_data():#協議輸入提取和轉碼 global ser req1=[] src = data_text.get(1.0, END).strip().replace('\n', '').encode() print(len(src)) print(src) req = re.findall(r"[^' ']",src.decode()) print(req) j = 0 while True: try: data=req[j]+req[j+1] req1.append(data) if j+1<len(req): j+=2 except IndexError : break print(req1) st=[] for i in range(len(req1)): a = int(req1[i],16) print(a) st.append(a) print(st) a=str(len(st))+'B' data=bytes(st) ser.write(data) init_window = Tk() init_window.title('串列埠傳送工具') init_window.geometry("1000x250+10+10") var1=StringVar() l=Label(init_window,bg='yellow',width=14,textvariable=var1) l.grid(row=0,column=0) var3=StringVar() var3.set('開啟串列埠') b1=Button(init_window,text='串列埠',width=10,height=1,command=print_selection) b1.grid(row=1,column=0) b2=Button(init_window,textvariable=var3,width=10,height=1,command=open_serial) b2.grid(row=1,column=2) b2=Button(init_window,text="傳送",width=10,height=1,command=get_data) b2.grid(row=1,column=4) b3=Button(init_window,text="重新整理串列埠",width=9,height=1,command=freshen) b3.place(x=15,y=150) t=Label(init_window,text="波特率") t.grid(row=0,column=1) var2=StringVar() var2.set(tuple(serial_com)) print("chuangk",serial_com) lis =Listbox(init_window,width=10,height=5,listvariable=var2)#顯示串列埠 lis.place(x=15,y=55) data_text = Text(init_window,width=80,height=1)#輸入傳輸字元 data_text.grid(row=1,column=3) data_text1=Text(init_window,width=70,height=10)#接收字元 data_text1.grid(row=2,column=3) data_text2=Text(init_window,width=10,height=1)#波特率設定 data_text2.grid(row=1,column=1) init_window.mainloop()