目录
安装依赖
功能包含
运行结果
安装依赖
pip install pyqt5 pyqtgraph pyserial
功能包含
自动检测串口设备,波特率选择/连接断开控制,数据发送/接收基础框架,实时绘图区域(需配合数据解析)
"""
PyQt5 上位机基础框架
功能:串口通信+数据可视化+基础控件
"""
import sys
from PyQt5.QtWidgets import *
from PyQt5.QtCore import Qt, QTimer
from PyQt5.QtSerialPort import QSerialPort, QSerialPortInfo
import pyqtgraph as pgclass 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_())