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

运行结果

相关推荐
kkeeper~4 小时前
0基础C语言积跬步之深入理解指针(5下)
c语言·开发语言
一直不明飞行4 小时前
Java的equals(),hashCode()应该在什么时候重写
java·开发语言·jvm
2301_803934614 小时前
Go语言如何做网络爬虫_Go语言爬虫开发教程【指南】
jvm·数据库·python
WL_Aurora4 小时前
Python爬虫实战(六):新发地蔬菜价格数据采集.
爬虫·python
盲敲代码的阿豪4 小时前
Python 入门基础教程(爬虫前置版)
开发语言·爬虫·python
basketball6165 小时前
C++ 构造函数完全指南:从入门到进阶
java·开发语言·c++
互联科技报5 小时前
2026超融合选型:Top5品牌与市场格局解读
开发语言·perl
weixin199701080165 小时前
[特殊字符] 智能数据采集:数字化转型的“数据石油勘探队”(附Python实战源码)
开发语言·python
想唱rap5 小时前
IO多路转接之poll
服务器·开发语言·数据库·c++
@杰克成6 小时前
Java学习30
java·开发语言·学习