工具效果如下如所示
下面简单介绍一下操作流程
1.打开PyCharm软件
2.创建一个工程
3.给该工程命名
4.在main.py里面黏贴如下的代码
# This is a sample Python script.
# Press Shift+F10 to execute it or replace it with your code.
# Press Double Shift to search everywhere for classes, files, tool windows, actions, and settings.
import serial
import threading
import timefrom tkinter import *
from tkinter.ttk import *
from tkinter import messageboxdef open_serial(a,b,c,d,e):global serprint("串口号:",a)print("波特率:",int(b))print("数据位:",c)print("停止位:",d)print("检验位:",e)bytesize = serial.EIGHTBITSif c == '7':bytesize = serial.SEVENBITSprint("select SEVENBITS")if c == '6':bytesize = serial.SIXBITSprint("select SIXBITS")if c == '5':bytesize = serial.FIVEBITSprint("select FIVEBITS")stopbitsize = serial.STOPBITS_ONEif d == '2':stopbitsize = serial.STOPBITS_TWOprint("select STOPBITS_TWO")paritysel = serial.PARITY_NONEif e == 'Odd':paritysel = serial.PARITY_ODDprint("select Odd")if e == 'Even':paritysel = serial.PARITY_EVENprint("select EVEN")ser=serial.Serial(port=a,baudrate=int(b),bytesize=bytesize,stopbits=stopbitsize,parity=paritysel,timeout=0.5)# ser = serial.Serial('COM4', 9600, timeout=1)def print_hi(name):# Use a breakpoint in the code line below to debug your script.print(f'Hi, {name}') # Press Ctrl+F8 to toggle the breakpoint.def print_log(log):time_start = time.time()date = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())print(f'{date}-{log}')def recv_hander():while 1:if ser.is_open:data = ser.read(1024).decode('gbk')print_log(data)msgshow.insert(END, data)def create_recv_thread():global thth = threading.Thread(target=recv_hander)th.setDaemon(True)th.start()def msg_send():msg = msginp.get()print_log(f'send==>{msg}')if ser.is_open:ser.write(msg.encode('gbk'))def open_com():print_log("open com")com_val = comnum.get()baud_val = baud.get() # 获取当前选定项目的值databit_val = databit.get()stopbit_var = stopbit.get()parity_var = parity.get()print(com_val)print(baud_val)open_serial(com_val, baud_val, databit_val, stopbit_var, parity_var)if ser.is_open:messagebox.showinfo("标题","串口打开成功")create_recv_thread()def close_com():print_log("close com")if ser.is_open:ser.close()# Press the green button in the gutter to run the script.
if __name__ == '__main__':print_hi('PyCharm')root = Tk()root.geometry('768x512')root.title('串口工具')comnumvar = StringVar()baudvar = StringVar()databitvar = StringVar()stopbitvar = StringVar()parityvar = StringVar()lb_com = Label(root, text='串口号')lb_com.place(relx=0.01, rely=0.05, relwidth=0.1, relheight=0.1)comnum = Combobox(root, textvariable=comnumvar, values=['COM1', 'COM2', 'COM3', 'COM4', ])comnum.place(relx=0.08, rely=0.075, relwidth=0.1)comnum.current(3)lb_baud = Label(root, text='波特率')lb_baud.place(relx=0.01, rely=0.12, relwidth=0.1, relheight=0.1) #add 0.045baud = Combobox(root, textvariable=baudvar, values=['115200', '38400', '9600', '4800', ])baud.place(relx=0.08, rely=0.145, relwidth=0.1) #add 0.025baud.current(2)lb_databit = Label(root, text='数据位')lb_databit.place(relx=0.01, rely=0.19, relwidth=0.1, relheight=0.1) #add 0.045databit = Combobox(root, textvariable=databitvar, values=['8', '7', '6', '5', ])databit.place(relx=0.08, rely=0.215, relwidth=0.1) #add 0.025databit.current(0)lb_stopbit = Label(root, text='停止位')lb_stopbit.place(relx=0.01, rely=0.26, relwidth=0.1, relheight=0.1)stopbit = Combobox(root, textvariable=stopbitvar, values=['1', '2', ])stopbit.place(relx=0.08, rely=0.285, relwidth=0.1)stopbit.current(0)lb_parity = Label(root, text='校验位')lb_parity.place(relx=0.01, rely=0.33, relwidth=0.1, relheight=0.1)parity = Combobox(root, textvariable=parityvar, values=['None','Odd','Even',])parity.place(relx=0.08, rely=0.355, relwidth=0.1)parity.current(0)btnopen = Button(root, text='打开串口', command=open_com)btnopen.place(relx=0.01, rely=0.45, relwidth=0.1, relheight=0.05)btnclose = Button(root, text='关闭串口', command=close_com)btnclose.place(relx=0.12, rely=0.45, relwidth=0.1, relheight=0.05)lb1 = Label(root, text='串口数据接收')lb1.place(relx=0.25, rely=0.05, relwidth=0.7, relheight=0.1)msgshow = Text(root)msgshow.place(relx=0.25, rely=0.15, relwidth=0.7, relheight=0.3)lb2 = Label(root, text='串口数据发送')lb2.place(relx=0.25, rely=0.45, relwidth=0.7, relheight=0.1)msginp = Entry(root)msginp.place(relx=0.25, rely=0.55, relwidth=0.7, relheight=0.1)btnsend = Button(root, text='发送', command=msg_send)btnsend.place(relx=0.35, rely=0.86, relwidth=0.3, relheight=0.1)root.mainloop()# See PyCharm help at https://www.jetbrains.com/help/pycharm/
5.执行脚本
6.如果有提示“No module named 'serial”,需要安装 pyserial,在终端命令行输入:pip install pyserial,如下图所示:
7.在windows下安装一对虚拟串口,可以下载vspd安装,最终结果如下所示:
8.使用第三方工具进行数据互发测试
9.将该工具打包成exe可执行文件
在命令行终端输入:python -m pysimplegui-exemaker.pysimplegui-exemaker
最后点击“Make EXE”,生成如下所示的exe文件