目录
安装依赖
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 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_())