基于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_())

运行结果

相关推荐
ayiya_Oese3 分钟前
[数据处理] 6. 数据可视化
人工智能·pytorch·python·深度学习·机器学习·信息可视化
没有梦想的咸鱼185-1037-166310 分钟前
【大语言模型ChatGPT4/4o 】“AI大模型+”多技术融合:赋能自然科学暨ChatGPT在地学、GIS、气象、农业、生态与环境领域中的应用
人工智能·python·机器学习·arcgis·语言模型·chatgpt·数据分析
长勺12 分钟前
Java云原生到底是啥,有哪些技术
java·开发语言·云原生
等等54334 分钟前
Java EE初阶——初识多线程
java·开发语言·jvm
hrrrrb35 分钟前
【Rust】枚举和模式匹配
开发语言·rust
小白学大数据44 分钟前
Python爬虫中time.sleep()与动态加载的配合使用
爬虫·python·scrapy·数据分析
沐雨潇竹1 小时前
使用定时器监视当前PID 如果当前程序关闭 UI_Core.exe 也随之自动关闭实现方法
开发语言·qt·ui
小饕1 小时前
LangChain构建大模型应用之问答系统(五)
人工智能·python·langchain
大锦终1 小时前
【C++】红黑树
c语言·开发语言·数据结构·c++
David Bates1 小时前
代码随想录第41天:图论2(岛屿系列)
python·算法·图论