# 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 time
from tkinter import *
from tkinter.ttk import *
from tkinter import messagebox
def open_serial(a,b,c,d,e):
global ser
print("串口号:",a)
print("波特率:",int(b))
print("数据位:",c)
print("停止位:",d)
print("检验位:",e)
bytesize = serial.EIGHTBITS
if c == '7':
bytesize = serial.SEVENBITS
print("select SEVENBITS")
if c == '6':
bytesize = serial.SIXBITS
print("select SIXBITS")
if c == '5':
bytesize = serial.FIVEBITS
print("select FIVEBITS")
stopbitsize = serial.STOPBITS_ONE
if d == '2':
stopbitsize = serial.STOPBITS_TWO
print("select STOPBITS_TWO")
paritysel = serial.PARITY_NONE
if e == 'Odd':
paritysel = serial.PARITY_ODD
print("select Odd")
if e == 'Even':
paritysel = serial.PARITY_EVEN
print("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 th
th = 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.045
baud = Combobox(root, textvariable=baudvar, values=['115200', '38400', '9600', '4800', ])
baud.place(relx=0.08, rely=0.145, relwidth=0.1) #add 0.025
baud.current(2)
lb_databit = Label(root, text='数据位')
lb_databit.place(relx=0.01, rely=0.19, relwidth=0.1, relheight=0.1) #add 0.045
databit = Combobox(root, textvariable=databitvar, values=['8', '7', '6', '5', ])
databit.place(relx=0.08, rely=0.215, relwidth=0.1) #add 0.025
databit.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/
基于python实现串口GUI编程源码
需积分: 0 127 浏览量
更新于2023-12-13
收藏 2KB RAR 举报
在IT行业中,Python是一种广泛应用的编程语言,以其简洁明了的语法和强大的库支持而闻名。在本主题中,我们关注的是"基于Python实现串口GUI编程源码",这通常指的是利用Python来创建一个图形用户界面(GUI),用于与硬件设备通过串行端口进行通信。下面将详细介绍这一领域的相关知识点。
Python中的串口通信通常依赖于第三方库,如`pyserial`。`pyserial`库提供了一系列API,允许开发者在Python程序中方便地打开、配置和读写串口。例如,我们可以使用`Serial()`函数初始化串口,`open()`方法打开串口,`write()`方法发送数据,以及`read()`或`readline()`方法接收数据。
```python
import serial
# 初始化串口
ser = serial.Serial('COM1', 9600) # COM1是串口名,9600是波特率
# 发送数据
ser.write(b'Hello, Serial!') # 发送字节数据
# 接收数据
received_data = ser.readline().decode('utf-8')
print(received_data)
```
接下来,构建GUI(图形用户界面)是另一个关键点。Python提供了多种库来实现这一目标,如Tkinter(Python的标准GUI库)、PyQt、wxPython等。在这个案例中,我们可能会使用Tkinter,因为它简单易用且内置在Python标准库中。
下面是一个简单的Tkinter GUI应用,用于显示串口通信的输入和输出:
```python
import tkinter as tk
from tkinter import messagebox
from threading import Thread
import serial
class SerialApp:
def __init__(self, root):
self.root = root
self.serial = serial.Serial('COM1', 9600)
# 创建控件
self.entry = tk.Entry(root)
self.send_button = tk.Button(root, text="发送", command=self.send_data)
self.text_area = tk.Text(root, wrap='word', width=40, height=20)
self.text_area.config(state='disabled')
# 布局
self.entry.pack()
self.send_button.pack()
self.text_area.pack()
def send_data(self):
data = self.entry.get()
self.serial.write(data.encode())
self.text_area.config(state='normal')
self.text_area.insert(tk.END, f"发送:{data}\n")
self.text_area.yview(tk.END)
self.text_area.config(state='disabled')
def update_data(self):
while True:
if self.serial.in_waiting > 0:
received = self.serial.read_all().decode()
self.text_area.config(state='normal')
self.text_area.insert(tk.END, f"接收:{received}\n")
self.text_area.yview(tk.END)
self.text_area.config(state='disabled')
self.root.update_idletasks()
if __name__ == "__main__":
root = tk.Tk()
app = SerialApp(root)
receive_thread = Thread(target=app.update_data)
receive_thread.start()
root.mainloop()
```
上述代码创建了一个简单的GUI窗口,包含一个文本输入框、一个发送按钮和一个文本区域。当用户在输入框中输入数据并点击发送按钮时,数据会被发送到串口,并在文本区域中记录发送的内容。同时,后台线程会持续检查串口是否有新的接收数据,并将其显示在文本区域中。
通过这样的串口GUI应用程序,开发者可以更直观地监控和控制通过串口通信的设备,这对于调试和测试硬件设备非常有用。在实际项目中,可能还需要添加更多的功能,比如错误处理、波特率选择、设备选择等功能,以满足不同的需求。
在提供的压缩包文件中,`main.py`很可能是实现这个串口GUI应用程序的源代码。如果要深入理解其工作原理,可以打开并分析该文件,了解各个函数和类的定义以及它们如何协同工作来实现串口通信和GUI交互。通过学习和理解这段代码,你可以掌握如何结合Python的串口通信和GUI编程,为自己的项目开发类似的工具。
赤露水
- 粉丝: 2561
- 资源: 45
最新资源
- 华彩-舜宇项目—公司年度培训计划表.doc
- 华彩-舜宇项目—联想---规划培训.ppt
- Screenshot_20241218_134907.jpg
- 华彩-舜宇项目—培训管理制度.doc
- 华彩-舜宇项目—培训管理体系.doc
- 基于flink (SQL)的特征加工平台详细文档+全部资料.zip
- 基于Flink+ClickHouse实时计算平台详细文档+全部资料.zip
- 华彩-舜宇项目—如何进行战略与年度规划培训.ppt
- 基于Flink 的商品实时推荐系统。当用户产生评分行为时,数据由 kafka 发送到 flink,根据用户历史评分行为进行实时和离线推荐。实时推荐包括:基于行为
- 基于Flink+ClickHouse构建亿级电商实时数据分析平台(PC、移动、小程序)详细文档+全部资料.zip
- 基于flink1.9.1,flink-sql-client模块SDK单独实现,支持Yarn集群的远程SQL任务发布,可以支撑flink sql任务的远程化执行详细文档+全部资料.zip
- 基于flink-sql在flink上运行sql构建数据流的平台详细文档+全部资料.zip
- 华彩咨询—杭挂集团—杭挂企业集团培训管理办法--外派培训.doc
- 华彩咨询—杭挂集团—杭挂企业集团培训管理办法(总则).doc
- 华彩咨询—杭挂集团—杭挂企业集团培训管理办法--新员工培训.doc
- 华彩咨询—杭挂集团—教育培训制度.doc