2024-09-01
Python
00

目录

最终效果
python环境
部分代码
实验结果
结论
参考文献

最终效果

在这里插入图片描述

python环境

powershell
pip install pyserial

部分代码

python
import tkinter as tk from tkinter import ttk import serial import threading class info_window: def __init__(self, in_str, parent): self.parent = parent # 保存父窗口对象 self.window = tk.Toplevel(parent) self.window.title("提示") self.window.iconbitmap('1.ico') self.window.geometry("220x60") label = tk.Label(self.window, text=in_str) buttonOK = tk.Button(self.window, text="OK", command=self.button_ok) label.pack(side=tk.TOP) buttonOK.pack(side=tk.BOTTOM) # 移动到parent屏幕中央 self.window.update() x = self.parent.winfo_x() + (self.parent.winfo_width() - self.window.winfo_reqwidth()) / 2 y = self.parent.winfo_y() + (self.parent.winfo_height() - self.window.winfo_reqheight()) / 2 self.window.geometry("+%d+%d" % (x, y)) def button_ok(self): self.window.destroy() class main_gui: def __init__(self): self.window = tk.Tk() self.window.title("代做QQ742971636") self.window.iconbitmap('1.ico') self.uartState = False # is uart open or not self.is_running = True # 帧布:1 config_frame = tk.Frame(self.window) config_frame.grid(row=1, column=1) label_com = tk.Label(config_frame, text="COMx: ") self.COM = tk.StringVar(value="COM4") ertryCOM = tk.Entry(config_frame, textvariable=self.COM) label_com.grid(row=1, column=1, padx=5, pady=3) ertryCOM.grid(row=1, column=2, padx=5, pady=3) label_baudrate = tk.Label(config_frame, text="波特率: ") self.Baudrate = tk.IntVar(value=9600) ertryBaudrate = tk.Entry(config_frame, textvariable=self.Baudrate) label_baudrate.grid(row=1, column=3, padx=5, pady=3) ertryBaudrate.grid(row=1, column=4, padx=5, pady=3) labelParity = tk.Label(config_frame, text="校验位: ") self.Parity = tk.StringVar(value="NONE") comboParity = ttk.Combobox(config_frame, width=17, textvariable=self.Parity) comboParity["values"] = ("NONE", "ODD", "EVEN", "MARK", "SPACE") comboParity["state"] = "readonly" labelParity.grid(row=2, column=1, padx=5, pady=3) comboParity.grid(row=2, column=2, padx=5, pady=3) labelStopbits = tk.Label(config_frame, text="停止位: ") self.Stopbits = tk.StringVar(value="1") comboStopbits = ttk.Combobox(config_frame, width=17, textvariable=self.Stopbits) comboStopbits["values"] = ("1", "1.5", "2") comboStopbits["state"] = "readonly" labelStopbits.grid(row=2, column=3, padx=5, pady=3) comboStopbits.grid(row=2, column=4, padx=5, pady=3) labelDatabits = tk.Label(config_frame, text="数据位: ") self.Databits = tk.StringVar(value="8") comboDatabits = ttk.Combobox(config_frame, width=17, textvariable=self.Databits) comboDatabits["values"] = ("8", "7", "6", "5") comboDatabits["state"] = "readonly" labelDatabits.grid(row=3, column=1, padx=5, pady=3) comboDatabits.grid(row=3, column=2, padx=5, pady=3) # 帧布:2 frame_open_serial = tk.Frame(self.window) frame_open_serial.grid(row=2, column=1) self.buttonSS = tk.Button(frame_open_serial, text="打开串口", command=self.open_serial) self.buttonSS.pack(side=tk.BOTTOM) # serial object self.ser = serial.Serial() self.read_data_from_serialThread = threading.Thread(target=self.read_data_from_serial) self.read_data_from_serialThread.start() # 帧布:3 rev_frame = tk.Frame(self.window) rev_frame.grid(row=3, column=1) labelOutText = tk.Label(rev_frame, text="接收数据:") labelOutText.grid(row=1, column=1, padx=3, pady=2, sticky=tk.W) rev_frameSon = tk.Frame(rev_frame) rev_frameSon.grid(row=2, column=1) scrollbarRecv = tk.Scrollbar(rev_frameSon) scrollbarRecv.pack(side=tk.RIGHT, fill=tk.Y) self.OutputText = tk.Text(rev_frameSon, wrap=tk.WORD, width=60, height=20, yscrollcommand=scrollbarRecv.set) self.OutputText.pack() # 帧布:4 clear_frame = tk.Frame(self.window) clear_frame.grid(row=4, column=1) self.buttonClear = tk.Button(clear_frame, text="清空", command=self.clear_received_data) self.buttonClear.pack(side=tk.BOTTOM) # 帧布:5 transfer_frame = tk.Frame(self.window) transfer_frame.grid(row=5, column=1) labelInText = tk.Label(transfer_frame, text="发送数据:") labelInText.grid(row=1, column=1, padx=3, pady=2, sticky=tk.W) transfer_frameSon = tk.Frame(transfer_frame) transfer_frameSon.grid(row=2, column=1) scrollbarTrans = tk.Scrollbar(transfer_frameSon) scrollbarTrans.pack(side=tk.RIGHT, fill=tk.Y) self.InputText = tk.Text(transfer_frameSon, wrap=tk.WORD, width=60, height=5, yscrollcommand=scrollbarTrans.set) self.InputText.insert(tk.END, "qq742971636代码测试\r\n") self.InputText.pack() # 帧布:6 send_frame = tk.Frame(self.window) send_frame.grid(row=6, column=1) self.buttonSend = tk.Button(send_frame, text="发送", command=self.send_data_to_serial) self.buttonSend.pack(side=tk.BOTTOM) self.window.protocol("WM_DELETE_WINDOW", self.on_closing) self.window.mainloop() def clear_received_data(self): self.OutputText.delete('1.0', tk.END) def open_serial(self): if self.uartState: self.ser.close() self.buttonSS["text"] = "打开串口" self.uartState = False else: # restart serial port self.ser.port = self.COM.get() self.ser.baudrate = self.Baudrate.get() strParity = self.Parity.get() if strParity == "NONE": self.ser.parity = serial.PARITY_NONE elif strParity == "ODD": self.ser.parity = serial.PARITY_ODD elif strParity == "EVEN": self.ser.parity = serial.PARITY_EVEN elif strParity == "MARK": self.ser.parity = serial.PARITY_MARK elif strParity == "SPACE": self.ser.parity = serial.PARITY_SPACE strStopbits = self.Stopbits.get() if strStopbits == "1": self.ser.stopbits = serial.STOPBITS_ONE elif strStopbits == "1.5": self.ser.stopbits = serial.STOPBITS_ONE_POINT_FIVE elif strStopbits == "2": self.ser.stopbits = serial.STOPBITS_TWO # 数据位8位 strDatabits = self.Databits.get() if strDatabits == "8": self.ser.bytesize = serial.EIGHTBITS elif strDatabits == "7": self.ser.bytesize = serial.SEVENBITS elif strDatabits == "6": self.ser.bytesize = serial.SIXBITS elif strDatabits == "5": self.ser.bytesize = serial.FIVEBITS try: self.ser.open() except: infromStr = "不能打开串口 " + self.ser.port info_window(infromStr, self.window) if self.ser.isOpen(): # open success self.buttonSS["text"] = "关闭串口" self.uartState = True ## 实验报告:串口通信图形用户界面设计与实现 ### 背景 本实验旨在设计和实现一个基于Python的图形用户界面(GUI),用于通过串口进行数据传输和接收。该界面允许用户配置串口参数,如端口号、波特率、校验位、停止位和数据位,并实现数据的发送与接收。串口通信在嵌入式系统、物联网设备以及工业控制等领域中广泛应用,能够实现不同设备之间的可靠通信。 ### 器件与工具 1. 计算机 2. Python 3.x 3. Tkinter库(用于GUI开发) 4. PySerial库(用于串口通信) 5. 串口设备(如开发板、传感器等) ### 硬件连接 1. 将计算机通过USB连接到串口设备。 2. 确认串口设备的端口号(如COM4)。 3. 根据设备的规格设置合适的波特率、校验位、停止位和数据位。 ### 设计原理 本实验通过Tkinter库创建一个图形用户界面,用户可以在界面中配置串口参数并进行数据的发送和接收。PySerial库用于实现串口通信。界面包括以下功能模块: 1. 串口配置模块:用户可以选择端口号、波特率、校验位、停止位和数据位。 2. 串口控制模块:打开和关闭串口。 3. 数据接收模块:显示接收到的数据。 4. 数据发送模块:用户输入要发送的数据并发送到串口。 ### 电路原理 电路连接较为简单,计算机通过USB接口与串口设备相连。串口设备的TX(发送)引脚连接到计算机的RX(接收)引脚,RX引脚连接到计算机的TX引脚,GND引脚连接到计算机的GND引脚。 ### 程序原理 程序使用Tkinter库创建主窗口和各个子窗口,使用PySerial库实现串口的打开、关闭、读写操作。程序包括以下几个主要部分: #### 串口配置 串口配置部分通过创建文本框和下拉菜单,供用户输入和选择端口号、波特率、校验位、停止位和数据位。以下代码片段展示了如何创建这些配置选项: ```python config_frame = tk.Frame(self.window) config_frame.grid(row=1, column=1) label_com = tk.Label(config_frame, text="COMx: ") self.COM = tk.StringVar(value="COM4") ertryCOM = tk.Entry(config_frame, textvariable=self.COM) label_com.grid(row=1, column=1, padx=5, pady=3) ertryCOM.grid(row=1, column=2, padx=5, pady=3) label_baudrate = tk.Label(config_frame, text="波特率: ") self.Baudrate = tk.IntVar(value=9600) ertryBaudrate = tk.Entry(config_frame, textvariable=self.Baudrate) label_baudrate.grid(row=1, column=3, padx=5, pady=3) ertryBaudrate.grid(row=1, column=4, padx=5, pady=3)

串口控制

串口控制部分包括打开和关闭串口的功能,通过点击按钮触发相应的事件。以下代码展示了如何实现串口的打开和关闭:

python
def open_serial(self): if self.uartState: self.ser.close() self.buttonSS["text"] = "打开串口" self.uartState = False else: self.ser.port = self.COM.get() self.ser.baudrate = self.Baudrate.get() self.ser.open() if self.ser.isOpen(): self.buttonSS["text"] = "关闭串口" self.uartState = True

数据接收与显示

数据接收部分通过创建一个线程不断读取串口数据,并将数据显示在文本框中:

python
self.read_data_from_serialThread = threading.Thread(target=self.read_data_from_serial) self.read_data_from_serialThread.start() def read_data_from_serial(self): while self.is_running: if self.ser.isOpen(): data = self.ser.read_all() if data: self.OutputText.insert(tk.END, data.decode('utf-8')) self.OutputText.see(tk.END)

数据发送

数据发送部分允许用户在文本框中输入要发送的数据,并通过点击按钮发送数据到串口:

python
def send_data_to_serial(self): if self.ser.isOpen(): data = self.InputText.get("1.0", tk.END).strip() self.ser.write(data.encode('utf-8'))

实验结果

通过上述设计和实现,成功开发了一个功能完整的串口通信图形用户界面。用户可以方便地配置串口参数,打开和关闭串口,发送和接收数据。该界面运行稳定,能够满足基本的串口通信需求。

结论

本实验通过使用Tkinter和PySerial库,实现了一个简单但功能强大的串口通信图形用户界面。该界面为用户提供了友好的操作方式,便于进行串口通信的配置和数据传输。未来可以在此基础上扩展更多功能,如增加日志记录、数据分析等。

参考文献

  • Python官方文档

  • Tkinter库使用手册

  • PySerial库使用手册

资源

https://docs.qq.com/sheet/DUEdqZ2lmbmR6UVdU?tab=BB08J2

如果对你有用的话,可以打赏哦
打赏
ali pay
wechat pay

本文作者:Dong

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 CC BY-NC。本作品采用《知识共享署名-非商业性使用 4.0 国际许可协议》进行许可。您可以在非商业用途下自由转载和修改,但必须注明出处并提供原作者链接。 许可协议。转载请注明出处!