PyQt5 实战:串口控制声光警报系统(完整源码 + 详细注释)

张开发
2026/4/19 0:31:35 15 分钟阅读

分享文章

PyQt5 实战:串口控制声光警报系统(完整源码 + 详细注释)
前言在工业控制、安防监控、智能硬件等场景中声光警报是最直观的报警提示方式。本文将用Python PyQt5 串口通信从零实现一个完整、可直接上线的声光警报控制系统。系统功能亮点6 个控制按钮声音 1、闪光 声音 1、声音 2、闪光 声音 2、闪光、关闭声光自动定时关闭触发报警 3 秒后自动停止标准串口指令支持 Modbus-RTU 十六进制格式异常弹窗提示串口打开失败、发送失败自动提醒安全释放资源关闭窗口自动关闭串口、停止定时器适合PyQt5 初学者、硬件控制开发者、嵌入式上位机开发者一、开发环境与依赖环境要求Python 3.8PyQt5 5.15.9pyserial 3.5串口声光警报模块安装依赖pip install pyqt5 pyserial二、Qt Designer 可视化界面设计全流程重点这是本文核心新增内容完整展示从 0 到 1 设计 Qt 界面 → 转 Python 代码 → 绑定功能的标准工业级流程。步骤 1打开 Qt Designer 工具安装 PyQt5 后直接在终端输入启动designer步骤 2新建主窗口选择Main Window→ 点击【Create】创建带菜单栏、状态栏的标准窗口。步骤 3拖拽控件布局从左侧Widget Box找到Push Button按钮控件拖拽6 个按钮到主窗口整齐排列选中按钮在右侧Property Editor修改geometry设置坐标和大小如 350,150, 161,91font设置字体大小为 14pttext修改按钮文字声音 1、闪光 声音 1…步骤 4信号槽自动绑定关键点击顶部菜单栏[信号 / 槽编辑器]选择每个按钮 →clicked()信号 → 绑定自定义槽函数slot1、slot2…自动生成信号槽连接代码步骤 5保存 UI 文件 → 转 Python 代码二、最终生成的 UI 代码警报.py# -*- coding: utf-8 -*- from PyQt5 import QtCore, QtGui, QtWidgets class Ui_MainWindow(object): def setupUi(self, MainWindow): MainWindow.setObjectName(MainWindow) MainWindow.resize(1154, 852) self.centralwidget QtWidgets.QWidget(MainWindow) self.centralwidget.setObjectName(centralwidget) # 按钮1声音1 self.pushButton QtWidgets.QPushButton(self.centralwidget) self.pushButton.setGeometry(QtCore.QRect(350, 150, 161, 91)) self.pushButton.setStyleSheet(font: 14pt \Arial\;) # 按钮2闪光声音1 self.pushButton_2 QtWidgets.QPushButton(self.centralwidget) self.pushButton_2.setGeometry(QtCore.QRect(590, 150, 161, 91)) self.pushButton_2.setStyleSheet(font: 14pt \Arial\;) # 按钮3声音2 self.pushButton_3 QtWidgets.QPushButton(self.centralwidget) self.pushButton_3.setGeometry(QtCore.QRect(350, 300, 161, 91)) self.pushButton_3.setStyleSheet(font: 14pt \Arial\;) # 按钮4闪光声音2 self.pushButton_4 QtWidgets.QPushButton(self.centralwidget) self.pushButton_4.setGeometry(QtCore.QRect(590, 300, 161, 91)) self.pushButton_4.setStyleSheet(font: 14pt \Arial\;) # 按钮5闪光 self.pushButton_5 QtWidgets.QPushButton(self.centralwidget) self.pushButton_5.setGeometry(QtCore.QRect(350, 450, 161, 91)) self.pushButton_5.setStyleSheet(font: 14pt \Arial\;) # 按钮6关闭声光 self.pushButton_6 QtWidgets.QPushButton(self.centralwidget) self.pushButton_6.setGeometry(QtCore.QRect(590, 450, 161, 91)) self.pushButton_6.setStyleSheet(font: 14pt \Arial\;) MainWindow.setCentralWidget(self.centralwidget) self.menubar QtWidgets.QMenuBar(MainWindow) MainWindow.setMenuBar(self.menubar) self.statusbar QtWidgets.QStatusBar(MainWindow) MainWindow.setStatusBar(self.statusbar) self.retranslateUi(MainWindow) # 信号槽绑定按钮点击 → 执行对应函数 self.pushButton.clicked.connect(MainWindow.slot1) self.pushButton_2.clicked.connect(MainWindow.slot2) self.pushButton_3.clicked.connect(MainWindow.slot3) self.pushButton_4.clicked.connect(MainWindow.slot4) self.pushButton_5.clicked.connect(MainWindow.slot5) self.pushButton_6.clicked.connect(MainWindow.slot6) QtCore.QMetaObject.connectSlotsByName(MainWindow) def retranslateUi(self, MainWindow): _translate QtCore.QCoreApplication.translate MainWindow.setWindowTitle(_translate(MainWindow, 声光警报控制系统)) self.pushButton.setText(_translate(MainWindow, 声音1)) self.pushButton_2.setText(_translate(MainWindow, 闪光声音1)) self.pushButton_3.setText(_translate(MainWindow, 声音2)) self.pushButton_4.setText(_translate(MainWindow, 闪光声音2)) self.pushButton_5.setText(_translate(MainWindow, 闪光)) self.pushButton_6.setText(_translate(MainWindow, 关闭声光))三、核心逻辑实现警报控制.py界面与逻辑分离业务代码不污染 UI 文件Qt 标准开发模式。from PyQt5 import QtCore, QtGui, QtWidgets from PyQt5.QtCore import * from PyQt5.QtWidgets import QMainWindow, QMessageBox import sys import serial from 警报 import Ui_MainWindow # 串口配置 SERIAL_PORT COM3 BAUDRATE 9600 # 声光指令十六进制 LIGHT_BUZZ1 0110001A000101CE18 # 闪光声音1 LIGHT_BUZZ2 0110001A0001040E1B # 闪光声音2 LIGHT 0110001A0001028E19 # 闪光 BUZZ1 0110001A0001034FD9 # 声音1 BUZZ2 0110001A000105CFDB # 声音2 BUZZ_CMD_CLOSE 0110001A0001000FD8 # 关闭声光 class PyQtMainEntry(QMainWindow, Ui_MainWindow): def __init__(self): super().__init__() self.setupUi(self) # 加载Qt Designer设计的界面 self.ser None # 单次定时器3秒自动关闭 self.timer QTimer(self) self.timer.setSingleShot(True) self.timer.timeout.connect(self.auto_close) self.init_serial() # 初始化串口 def init_serial(self): try: self.ser serial.Serial(SERIAL_PORT, BAUDRATE, timeout0.5) print(串口打开成功, SERIAL_PORT) except Exception as e: QMessageBox.critical(self, 错误, f串口打开失败{str(e)}) # 发送十六进制指令 def send_cmd(self, cmd): if not self.ser or not self.ser.is_open: QMessageBox.warning(self, 警告, 串口未打开) return try: data bytes.fromhex(cmd) self.ser.write(data) print(发送, cmd) except Exception as e: QMessageBox.critical(self, 发送失败, str(e)) # 3秒自动关闭报警 def auto_close(self): self.send_cmd(BUZZ_CMD_CLOSE) print(3秒到自动关闭声光) # 按钮事件与Qt界面绑定的槽函数 def slot1(self): self.send_cmd(BUZZ1) self.timer.start(3000) def slot2(self): self.send_cmd(LIGHT_BUZZ1) self.timer.start(3000) def slot3(self): self.send_cmd(BUZZ2) self.timer.start(3000) def slot4(self): self.send_cmd(LIGHT_BUZZ2) self.timer.start(3000) def slot5(self): self.send_cmd(LIGHT) self.timer.start(3000) def slot6(self): self.timer.stop() self.send_cmd(BUZZ_CMD_CLOSE) # 关闭窗口时释放资源 def closeEvent(self, event): if self.timer.isActive(): self.timer.stop() if self.ser and self.ser.is_open: self.ser.close() print(串口已关闭) event.accept() if __name__ __main__: app QtWidgets.QApplication(sys.argv) window PyQtMainEntry() window.show() sys.exit(app.exec_())四、运行与使用将两个文件放在同一目录修改SERIAL_PORT为你的串口号如 COM3、/dev/ttyUSB0运行警报控制.py点击按钮触发对应声光效果3 秒自动关闭或手动点击关闭五、Qt 界面设计核心流程总结必看这是企业级 PyQt 开发标准步骤所有 GUI 项目通用打开 Qt Designer→ 可视化拖拽控件设置属性大小、文字、字体、样式信号槽绑定按钮点击 → 函数保存 UI → pyuic5 转 Python 代码逻辑类继承 UI 类实现业务功能安全关闭释放串口、定时器资源六、扩展方向增加串口选择下拉框自动扫描可用串口支持自定义报警时长输入框添加运行日志面板实时显示发送记录支持多设备联动扩展更多报警模式打包成 exepyinstaller -w -i logo.ico 警报控制.py

更多文章