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

运行结果

相关推荐
索迪迈科技24 分钟前
java后端工程师进修ing(研一版 || day40)
java·开发语言·学习·算法
Zz_waiting.1 小时前
Javaweb - 14.6 - Vue3 数据交互 Axios
开发语言·前端·javascript·vue·axios
萌新小码农‍1 小时前
Java分页 Element—UI
java·开发语言·ui
大佬,救命!!!1 小时前
整理python快速构建数据可视化前端的Dash库
python·信息可视化·学习笔记·dash·记录成长
孔丘闻言1 小时前
python调用mysql
android·python·mysql
Tiger_shl1 小时前
【.Net技术栈梳理】03-核心框架与运行时(异常处理)
开发语言·.net
再睡亿分钟!1 小时前
Spring MVC 的常用注解
java·开发语言·spring boot·spring
Teletele-Lin1 小时前
Miniconda安装与VSCode搭建远程Python、Jupyter开发环境
vscode·python·jupyter·环境配置·远程开发
MChine慕青2 小时前
顺序表与单链表:核心原理与实战应用
linux·c语言·开发语言·数据结构·c++·算法·链表
qq_195551692 小时前
代码随想录70期day7
java·开发语言