PyQT——URAT串口调试助手(上位机界面)

页面实现效果:

main.py
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *
import sys
from ui.Ui_main_window import Ui_MainWindow
from views.serial_assist_widget import *


class MainWidget(QMainWindow):
    def __init__(self, parent=None):
        super().__init__(parent)
        self.setWindowTitle('自定义窗口标题')
        self.ui = Ui_MainWindow()
        self.ui.setupUi(self)
        # 初始化UI界面
        self.init_ui()

    def init_ui(self):
        self.ui.tabWidget.addTab(SerialAssistWidget(self),"串口助手工具")


if __name__ == '__main__':
    app = QApplication(sys.argv)
    widget = MainWidget()
    widget.show()
    sys.exit(app.exec_())
serial_assist_widget.py
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *
import sys
import threading
sys.path.append('../')
from ui.Ui_serial_assist_widget import Ui_SerialAssistWidget
from views.serial_setting_dialog import SettingDialog
from drivers.driver_serial import *


class SerialAssistWidget(QWidget):
    def __init__(self, parent=None):
        super().__init__(parent)       
        self.ui = Ui_SerialAssistWidget()
        self.ui.setupUi(self)

        self.sp = None
        
        # 设备列表默认为空
        self.device_port = []
        
        # 打开页面要扫描设备并显示
        self.refresh_device_slot()
        
        # 点击事件
        self.init_ui()
        
    def init_ui(self):
        # 波特率设置按钮信号与槽函数
        self.ui.btn_setting.clicked.connect(self.show_dialog_slot)
        # 设备刷新按钮信号与槽函数
        self.ui.btn_refersh.clicked.connect(self.refresh_device_slot)
        # 链接设备按钮信号与槽函数
        self.ui.btn_connect.clicked.connect(self.btn_connect_slot)
        # 发送数据按钮信号与槽函数
        self.ui.btn_send.clicked.connect(self.btn_send_slot)
        # 清空数据发送按钮信号与槽函数
        self.ui.pushButton_4.clicked.connect(self.clear_send_text)
        # 清空数据接受按钮信号与槽函数
        self.ui.pushButton_3.clicked.connect(self.clear_recv_text)
        
    
    def clear_send_text(self):
        self.ui.edit_send.clear()
        
    def clear_recv_text(self):
        self.ui.edit_recv.clear()
        
    def btn_send_slot(self):
        if not self.sp:
            QMessageBox.warning(self,"警告","请先链接设备")
            return
        send_text = self.ui.edit_send.toPlainText()
        if send_text == '':
            QMessageBox.warning(self,"警告","请输入要发送的内容")
            return
        self.sp.write(send_text.encode("utf-8"))
        # 在末尾必须加上换行符,否则不能立即收到
        self.sp.write(b'\n')
        
        
    def btn_connect_slot(self):
        # 如果设备未选择,则弹出警告提示
        if not self.device_port:
            QMessageBox.warning(self,"警告","请选择设备")
            return
        # 如果self.sp为真说明已经链接了,再次点击要断开链接
        if self.sp:
            self.sp.close()
            self.ui.btn_connect.setText("点击链接")
            self.ui.label_status.setPixmap(QPixmap(':/icon/disc'))
            self.sp=None
            return
            
        # 收集波特率和设备信息
        baud = self.ui.cb_baud.currentText()
        device_index = self.ui.cb_device.currentIndex()
        print(device_index,type(device_index))
        print(self.device_port)
        device_name = self.device_port[device_index][0]
        
        
        # 链接设备,成功则设置按钮状态与图标,失败则弹出警告
        self.sp = SerialDevice(device_name,int(baud))
        res, msg = self.sp.open()
        if not res:
            QMessageBox.warning(self,"警告",msg)
            return
        # 设置按钮状态与图标
        self.ui.btn_connect.setText("断开链接(已链接)")
        self.ui.label_status.setPixmap(QPixmap(':/icon/connect'))
        
        # 链接成功后就应开启子线程接受数据
        t = threading.Thread(target=self.recv_data,daemon=True)
        t.start()
        
    def recv_data(self):
        while True:
            data = self.sp.readline()
            # 去掉末尾的换行符
            data = data[:-1].decode('utf-8')
            self.ui.edit_recv.append(data)
            
    
    def refresh_device_slot(self):
        self.device_port = scan_serial_ports()
        print(self.device_port)
        if len(self.device_port)>0:
            for device,description in self.device_port:
                self.ui.cb_device.addItem(description)
            # 设置默认选择第一个
            self.ui.cb_device.setCurrentIndex(0)
        
    def show_dialog_slot(self):
        self.dialog = SettingDialog(self)
        self.dialog.signal.connect(self.dialog_slot)
        self.dialog.exec_()
        
    def dialog_slot(self,bt,data_bite):
        # 将信号中的bt同步到串口助手页面
        self.ui.cb_baud.setCurrentText(bt)
        


if __name__ == '__main__':
    app = QApplication(sys.argv)
    widget = SerialAssistWidget()
    widget.show()
    sys.exit(app.exec_())
serial_setting_dialog.py
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *
import sys
sys.path.append("../")
from ui.Ui_serial_setting_dialog import Ui_Dialog


class SettingDialog(QDialog):
    setting_signal = pyqtSignal(str,str)
    def __init__(self, parent=None):
        super().__init__(parent)
        self.setWindowTitle('自定义窗口标题')
        # 初始化UI界面
        
        self.ui = Ui_Dialog()
        self.ui.setupUi(self)
        
        self.init_ui()
        
        
    def btn_ok_slot(self):
        bt = self.ui.cb_bt.currentText()
        data = self.ui.cb_data.currentText()
        self.setting_signal.emit(bt,data)
        self.close()
        
        
    def init_ui(self):
        self.ui.btnOk.clicked.connect(self.btn_ok_slot)
        self.ui.btnCancel.clicked.connect(self.close)


if __name__ == '__main__':
    app = QApplication(sys.argv)
    widget = SettingDialog()
    widget.show()
    sys.exit(app.exec_())

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值