基于pyqt的上位机开发

目录

安装依赖

功能包含

运行结果


安装依赖

bash 复制代码
pip install pyqt5 pyqtgraph pyserial 

功能包含

自动检测串口设备,波特率选择/连接断开控制,数据发送/接收基础框架,实时绘图区域(需配合数据解析)

python 复制代码
"""
PyQt5 上位机基础框架
功能:串口通信+数据可视化+基础控件
"""
import sys
from PyQt5.QtWidgets import *
from PyQt5.QtCore import Qt, QTimer
from PyQt5.QtSerialPort import QSerialPort, QSerialPortInfo
import pyqtgraph as pg


class SerialMonitor(QMainWindow):
    def __init__(self):
        super().__init__()

        self.serial = QSerialPort()
        self.initUI()
        self.initSerial()

    def initUI(self):
        self.setWindowTitle("Serial Monitor")
        self.setGeometry(300, 300, 800, 600)

        # 中央控件
        central = QWidget()
        self.setCentralWidget(central)
        layout = QHBoxLayout(central)

        # 左侧控制面板
        controlPanel = QGroupBox("串口设置")
        controlLayout = QVBoxLayout()
        self.portCombo = QComboBox()
        self.baudCombo = QComboBox()
        self.connectBtn = QPushButton("打开串口")
        self.sendText = QLineEdit()
        self.sendBtn = QPushButton("发送数据")

        # 填充控件
        self.baudCombo.addItems(['9600', '115200', '230400'])
        controlLayout.addWidget(QLabel("端口:"))
        controlLayout.addWidget(self.portCombo)
        controlLayout.addWidget(QLabel("波特率:"))
        controlLayout.addWidget(self.baudCombo)
        controlLayout.addWidget(self.connectBtn)
        controlLayout.addWidget(QLabel("发送数据:"))
        controlLayout.addWidget(self.sendText)
        controlLayout.addWidget(self.sendBtn)
        controlPanel.setLayout(controlLayout)

        # 右侧绘图区域
        self.plotWidget = pg.PlotWidget()
        self.plotWidget.setBackground('w')
        self.curve = self.plotWidget.plot(pen='b')

        layout.addWidget(controlPanel, 1)
        layout.addWidget(self.plotWidget, 3)

        # 信号连接
        self.connectBtn.clicked.connect(self.toggleSerial)
        self.sendBtn.clicked.connect(self.sendData)
        self.serial.readyRead.connect(self.readData)

    def initSerial(self):
        ports = QSerialPortInfo.availablePorts()
        self.portCombo.clear()
        for port in ports:
            self.portCombo.addItem(port.portName())

    def toggleSerial(self):
        if self.serial.isOpen():
            self.serial.close()
            self.connectBtn.setText("打开串口")
        else:
            self.serial.setPortName(self.portCombo.currentText())
            self.serial.setBaudRate(int(self.baudCombo.currentText()))
            if self.serial.open(QSerialPort.ReadWrite):
                self.connectBtn.setText("关闭串口")

    def readData(self):
        data = self.serial.readAll().data()
        # 示例:显示原始数据(需根据协议解析)
        print(data.decode('ascii', errors='replace'))

    def sendData(self):
        text = self.sendText.text().encode()
        if self.serial.isOpen():
            self.serial.write(text)


if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = SerialMonitor()
    window.show()
    sys.exit(app.exec_())

运行结果

相关推荐
韩立学长7 分钟前
【开题答辩实录分享】以《基于Python的大学超市仓储信息管理系统的设计与实现》为例进行选题答辩实录分享
开发语言·python
qq_192779879 分钟前
高级爬虫技巧:处理JavaScript渲染(Selenium)
jvm·数据库·python
u01092727128 分钟前
使用Plotly创建交互式图表
jvm·数据库·python
爱学习的阿磊29 分钟前
Python GUI开发:Tkinter入门教程
jvm·数据库·python
froginwe1130 分钟前
Scala 循环
开发语言
m0_706653231 小时前
C++编译期数组操作
开发语言·c++·算法
故事和你911 小时前
sdut-Java面向对象-06 继承和多态、抽象类和接口(函数题:10-18题)
java·开发语言·算法·面向对象·基础语法·继承和多态·抽象类和接口
Bruk.Liu1 小时前
(LangChain实战2):LangChain消息(message)的使用
开发语言·langchain
Imm7771 小时前
中国知名的车膜品牌推荐几家
人工智能·python
qq_423233901 小时前
C++与Python混合编程实战
开发语言·c++·算法