python+pyserial+pyqt5串口助手软件详细讲解

本文详细讲解了一个基于Python、pyserial和PyQt5的串口助手软件的实现,包括工程目录结构、关键代码分析及串口通信逻辑。主要内容涉及窗口初始化、串口刷新、数据接收线程以及发送功能的实现。
摘要由CSDN通过智能技术生成

        阅读本篇文章前请你先阅读https://blog.csdn.net/fhqlongteng/article/details/78535393,了解串口助手软件的功能,界面,并且下载最新版本(V1.1)的软件源代码,本篇博文讲解的代码即是1.1版本的源代码。

1、工程目录结构

       pycom工程主要由pycom_ui文件夹,com.ico,mainwindow.py,pycom1.1.py, pyico.py, make_exe.bat这几个文件结成。pycom_ui文件夹里存放的是ui界面设计文件,pycom1.1.py文件实现串口助手软件的所有应用逻辑功能代码,mainwindow.py是串口助手软件的窗口部分代码,由qt creator生成,pyico.py文件是把软件中所使用的软件图标,软件内显示的图片等资源文件通过qt自带工具生成,version.txt是一个版本信息的文件,用于打包生成时输入软件的版本信息,公司名称等。

 

     pycom_ui文件夹中是设计的窗口界面的全部文件,是一个qtcreator工程,mainwindow.ui是工程文件,可以使用qtcreator软件打开可以编辑窗口文件。使用qtcreator可以对窗口界面进行编辑,添加输入窗口,按钮,文本框等各种控件。

      make_uipy.bat中的一个批处理文件,文件内容是pyuic5 mainwindow.ui -o mainwindow.py,相当于执行pyuic5命令,把qtcreator生成的工程文件生成mainwindow.py文件。

      mainwindos.qrc是一个资源文件,可以手工使用记事本来进行编辑。资源文件中填写程序中所使用的图标文件,图片文件。

    make_png.bat是一个批处理文件,文件的内容是pyrcc5 mainwindow.qrc -o pyico.py,功能是把mainwindow.qrc资源文件中引用的图片文件生成pyico.py图标文件,供应用程序调用在窗口中生成显示图标,显示图片。双击运行一下就可以。

    pycom_ui文件夹中一共通过批处理命令生成2个文件 mainwindow.py,  pyico.py文件,所这两个文件复制串口助手应用文件pycom1.1.py所在的目录下,本工程是在上一次目录下面。如下图。

     pycom目录下面包含有mainwindow.py , pyico.py, pycom1.1.py,make_exe.bat,com.ico, version.txt  这5个必须的文件,其他文件均是自动在打包过程生成的。pycom1.1.py文件是实现串口助手所有软件逻辑的文件,完全根据功能编写出来。com.ico是软件打包成exe文件后显示出来的图标文件,version.txt是版本信息文件,用于pyinstaller软件打包时读取产品版本信息,注意此文件要保存utf-8编码方式的,即不能使用记事本程序保存,可以使用sublimetext3软件编辑。

2、串口助手应用逻辑pycom1.1.py分析

     串口助手的主要应用逻辑文件就是pycom1.1.py文件,文件中实现串口助手的所有功能。

       MainWindow类中__init__实现串口助手窗口的初始化操作。初始化操作包括,设置应用程序的窗口图标,初始化发送接收计数变量,刷新串口列表,创建串口接收数据线程,给窗口中的各个按钮注册鼠标单击事件处理函数。

class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow):
    
    def __init__(self, parent=None):
        super(MainWindow, self).__init__(parent)
        s
以下是使用Python3、PyQT5Pyserial实现串口工具的方法: 1. 安装PyserialPyQT5库 在终端或命令行中输入以下命令来安装PyserialPyQT5: ``` pip install pyserial pip install pyqt5 ``` 2. 创建GUI界面 使用PyQT5创建一个简单的GUI界面。在这个界面中,你需要添加一个下拉菜单来选择串口、一个文本框来显示串口数据和一些按钮来打开/关闭串口和发送数据。 下面是一个简单的PyQT5串口工具界面: ```python import sys from PyQt5.QtWidgets import QApplication, QMainWindow, QComboBox, QTextEdit, QPushButton, QHBoxLayout, QVBoxLayout, QWidget class SerialTool(QMainWindow): def __init__(self): super().__init__() self.initUI() def initUI(self): # 设置窗口大小 self.setGeometry(100, 100, 400, 300) # 设置窗口标题 self.setWindowTitle('Serial Tool') # 添加下拉菜单 self.portComboBox = QComboBox(self) self.portComboBox.move(10, 10) self.portComboBox.resize(180, 30) # 添加文本框 self.textEdit = QTextEdit(self) self.textEdit.move(10, 50) self.textEdit.resize(380, 180) # 添加按钮 self.openButton = QPushButton('Open', self) self.openButton.move(10, 240) self.openButton.resize(80, 30) self.closeButton = QPushButton('Close', self) self.closeButton.move(100, 240) self.closeButton.resize(80, 30) self.sendButton = QPushButton('Send', self) self.sendButton.move(190, 240) self.sendButton.resize(80, 30) self.clearButton = QPushButton('Clear', self) self.clearButton.move(280, 240) self.clearButton.resize(80, 30) # 添加布局管理器 hbox = QHBoxLayout() hbox.addStretch(1) hbox.addWidget(self.openButton) hbox.addWidget(self.closeButton) hbox.addWidget(self.sendButton) hbox.addWidget(self.clearButton) vbox = QVBoxLayout() vbox.addWidget(self.portComboBox) vbox.addLayout(hbox) widget = QWidget() widget.setLayout(vbox) self.setCentralWidget(widget) ``` 3. 实现串口操作 使用Pyserial库来创建串口连接。在打开串口之前,你需要获取可用的串口列表并将它们添加到下拉菜单中。在发送数据之前,你需要从文本框中获取数据。 下面是一个简单的Pyserial串口操作代码: ```python import serial class SerialTool(QMainWindow): def __init__(self): super().__init__() self.initUI() self.initSerial() def initSerial(self): # 获取可用串口列表 ports = serial.tools.list_ports.comports() # 将可用串口添加到下拉菜单中 for port in ports: self.portComboBox.addItem(port.device) # 创建串口连接 self.ser = serial.Serial() def openSerial(self): # 设置串口参数 port = self.portComboBox.currentText() baudrate = 9600 bytesize = serial.EIGHTBITS parity = serial.PARITY_NONE stopbits = serial.STOPBITS_ONE self.ser.port = port self.ser.baudrate = baudrate self.ser.bytesize = bytesize self.ser.parity = parity self.ser.stopbits = stopbits # 打开串口连接 try: self.ser.open() self.ser.flushInput() self.ser.flushOutput() self.textEdit.append('Serial port is open.') except Exception as e: self.textEdit.append(str(e)) def closeSerial(self): # 关闭串口连接 try: self.ser.close() self.textEdit.append('Serial port is closed.') except Exception as e: self.textEdit.append(str(e)) def sendSerial(self): # 发送数据 data = self.textEdit.toPlainText() try: self.ser.write(data.encode()) self.textEdit.clear() self.textEdit.append('Data is sent: ' + data) except Exception as e: self.textEdit.append(str(e)) ``` 4. 运行程序 将GUI界面和串口操作代码组合起来,并在主函数中运行程序。 下面是一个完整的PyQT5串口工具代码: ```python import sys import serial from PyQt5.QtWidgets import QApplication, QMainWindow, QComboBox, QTextEdit, QPushButton, QHBoxLayout, QVBoxLayout, QWidget class SerialTool(QMainWindow): def __init__(self): super().__init__() self.initUI() self.initSerial() def initUI(self): # 设置窗口大小 self.setGeometry(100, 100, 400, 300) # 设置窗口标题 self.setWindowTitle('Serial Tool') # 添加下拉菜单 self.portComboBox = QComboBox(self) self.portComboBox.move(10, 10) self.portComboBox.resize(180, 30) # 添加文本框 self.textEdit = QTextEdit(self) self.textEdit.move(10, 50) self.textEdit.resize(380, 180) # 添加按钮 self.openButton = QPushButton('Open', self) self.openButton.move(10, 240) self.openButton.resize(80, 30) self.closeButton = QPushButton('Close', self) self.closeButton.move(100, 240) self.closeButton.resize(80, 30) self.sendButton = QPushButton('Send', self) self.sendButton.move(190, 240) self.sendButton.resize(80, 30) self.clearButton = QPushButton('Clear', self) self.clearButton.move(280, 240) self.clearButton.resize(80, 30) # 添加布局管理器 hbox = QHBoxLayout() hbox.addStretch(1) hbox.addWidget(self.openButton) hbox.addWidget(self.closeButton) hbox.addWidget(self.sendButton) hbox.addWidget(self.clearButton) vbox = QVBoxLayout() vbox.addWidget(self.portComboBox) vbox.addLayout(hbox) widget = QWidget() widget.setLayout(vbox) self.setCentralWidget(widget) # 绑定按钮事件 self.openButton.clicked.connect(self.openSerial) self.closeButton.clicked.connect(self.closeSerial) self.sendButton.clicked.connect(self.sendSerial) self.clearButton.clicked.connect(self.textEdit.clear) def initSerial(self): # 获取可用串口列表 ports = serial.tools.list_ports.comports() # 将可用串口添加到下拉菜单中 for port in ports: self.portComboBox.addItem(port.device) # 创建串口连接 self.ser = serial.Serial() def openSerial(self): # 设置串口参数 port = self.portComboBox.currentText() baudrate = 9600 bytesize = serial.EIGHTBITS parity = serial.PARITY_NONE stopbits = serial.STOPBITS_ONE self.ser.port = port self.ser.baudrate = baudrate self.ser.bytesize = bytesize self.ser.parity = parity self.ser.stopbits = stopbits # 打开串口连接 try: self.ser.open() self.ser.flushInput() self.ser.flushOutput() self.textEdit.append('Serial port is open.') except Exception as e: self.textEdit.append(str(e)) def closeSerial(self): # 关闭串口连接 try: self.ser.close() self.textEdit.append('Serial port is closed.') except Exception as e: self.textEdit.append(str(e)) def sendSerial(self): # 发送数据 data = self.textEdit.toPlainText() try: self.ser.write(data.encode()) self.textEdit.clear() self.textEdit.append('Data is sent: ' + data) except Exception as e: self.textEdit.append(str(e)) if __name__ == '__main__': app = QApplication(sys.argv) serialTool = SerialTool() serialTool.show() sys.exit(app.exec_()) ``` 运行程序后,你应该可以打开串口并发送数据了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值