PyQt5串口工具简易功能版

本文介绍了一款基于PyQt5构建的串口调试应用,具备全屏显示、历史命令上下键调用及回车发送功能。用户可以进行串口设置,如选择串口和波特率,同时在接收区和发送区查看和输入数据。该工具还实现了串口的打开和关闭操作,以及数据的接收和发送。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

重新基于PyQt5 grid的排列方式写了一个串口工具,可以全屏窗口,可以上下键调用历史命令,使用回车键发送命令等功能,待继续完善相关功能,希望大神指点!

import sys
import serial
import serial.tools.list_ports

# from PyQt5 import QtWidgets
from PyQt5.QtWidgets import QLineEdit, QTextEdit, QWidget, QPushButton, QGroupBox, \
                            QApplication, QLabel, QComboBox, QGridLayout, QMessageBox
from PyQt5.QtCore import Qt, QTimer
from PyQt5.QtGui import QFont

class Example(QWidget):
    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):
        # self.setGeometry(300, 300, 500, 500)
        self.setWindowTitle('串口调试小助手')

        form1 = QGroupBox(self)
        form1.setTitle('串口设置')
        form1.setFont(QFont("Microsoft YaHei"))
        f1_lab1 = QLabel('串口检测', self)
        f1_lab1.setFont(QFont("Microsoft YaHei"))
        f1_bt1 = QPushButton('串口检测', self)
        f1_bt1.setFont(QFont("Microsoft YaHei"))
        f1_lab2 = QLabel('选择串口', self)
        f1_lab2.setFont(QFont("Microsoft YaHei"))
        f1_box2 = QComboBox(self)
        f1_box2.setFont(QFont("Microsoft YaHei"))
        f1_lab3 = QLabel('选择波特率', self)
        f1_lab3.setFont(QFont("Microsoft YaHei"))
        f1_box3 = QComboBox(self)
        f1_box3.setFont(QFont("Microsoft YaHei"))
        f1_box3.insertItem(0, '115200')
        f1_box3.insertItem(1, '74880')
        f1_lab4 = QLabel('当前串口:', self)
        f1_lab4.setFont(QFont("Microsoft YaHei"))
        f1_lab5 = QLabel(self)
        f1_lab5.setFont(QFont("Microsoft YaHei"))
        f1_bt2 = QPushButton('打开串口', self)
        f1_bt2.setFont(QFont("Microsoft YaHei"))
        f1_bt3 = QPushButton('关闭串口', self)
        f1_bt3.setFont(QFont("Microsoft YaHei"))
        
        form2 = QGroupBox(self)
        form2.setTitle('接收区')
        form2.setFont(QFont("Microsoft YaHei"))
        f2_text1 = QTextEdit(self)
        f2_text1.setFont(QFont("Microsoft YaHei"))
        f2_text1.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOn)
        
        form3 = QGroupBox(self)
        form3.setTitle('发送区')
        form3.setFont(QFont("Microsoft YaHei"))
        f3_box1 = QComboBox(self)
        f3_box1.setFont(QFont("Microsoft YaHei"))
        f3_line1 = QLineEdit(self)
        f3_line1.setFont(QFont("Microsoft YaHei"))
        f3_bt1 = QPushButton('发送', self)
        f3_bt1.setFont(QFont("Microsoft YaHei"))
        f3_bt2 = QPushButton('清空', self)
        f3_bt2.setFont(QFont("Microsoft YaHei"))

        self.ser = serial.Serial()
        self.timer = QTimer(self)
        self.msg_index = 0
        self.log_msg = []
        self.log_list = []

        self.form1 = form1
        self.f1_lab1 = f1_lab1 #检测串口
        self.f1_bt1 = f1_bt1 #检测串口
        self.f1_lab2 = f1_lab2 #串口
        self.f1_box2 = f1_box2 #串口下拉窗
        self.f1_lab3 = f1_lab3 #波特率
        self.f1_box3 = f1_box3 #波特率下拉窗
        self.f1_lab4 = f1_lab4 #当前串口
        self.f1_lab5 = f1_lab5 #当前串口信息
        self.f1_bt2 = f1_bt2 #打开
        self.f1_bt3 = f1_bt3 #关闭
        self.form2 = form2 #接收区
        self.f2_text1 = f2_text1 #接收文本框
        self.form3 = form3 #发送区
        self.f3_box1 = f3_box1 #发送记录
        self.f3_line1 = f3_line1 #发送框
        self.f3_bt1 = f3_bt1
        self.f3_bt2 = f3_bt2


        grid = QGridLayout()
        grid.setSpacing(20)
        grid.addWidget(form1, 1, 1, 8, 7)
        grid.addWidget(f1_lab1, 2, 2, 1, 2)
        grid.addWidget(f1_bt1, 2, 4, 1, 3)
        grid.addWidget(f1_lab2, 3, 2, 1, 2)
        grid.addWidget(f1_box2, 3, 4, 1, 3)
        grid.addWidget(f1_lab3, 4, 2, 1, 2)
        grid.addWidget(f1_box3, 4, 4, 1, 3)
        grid.addWidget(f1_lab4, 5, 2, 1, 2)
        grid.addWidget(f1_lab5, 5, 4, 1, 3)
        grid.addWidget(f1_bt2, 6, 2, 1, 5)
        grid.addWidget(f1_bt3, 7, 2, 1, 5)
        grid.addWidget(form2, 1, 8, 20, 50)
        grid.addWidget(f2_text1, 2, 9, 18, 48)
        grid.addWidget(form3, 21, 8, 6, 50)
        # grid.addWidget(f3_lab1, 22, 9, 1, 5)
        # grid.addWidget(f3_lab2, 22, 14, 1, 35)
        grid.addWidget(f3_box1, 23, 9, 1, 48)
        grid.addWidget(f3_line1, 24, 9, 1, 48)
        grid.addWidget(f3_bt1, 25, 42, 1, 6)
        grid.addWidget(f3_bt2, 25, 51, 1, 6 )
        self.setLayout(grid)
        self.show()

        self.f1_bt1.clicked.connect(self.port_check)
        self.f1_box2.currentTextChanged.connect(self.port_info)
        self.f1_bt2.clicked.connect(self.port_open)
        self.f1_bt3.clicked.connect(self.port_close)
        self.f3_line1.returnPressed.connect(self.send_data)
        self.f3_bt1.clicked.connect(self.send_data)
        self.timer.timeout.connect(self.receive_data)

    def print1(self):
        print('This is open button')
        self.f2_text1.setText('this is open button in f2_text1')
        self.text2.setText('this is open button in text2')

    def print2(self):
        print('This is close button')
        self.f2_text1.clear()
        self.text2.clear()

    def port_check(self):
        self.com_list = []
        port_list =list(serial.tools.list_ports.comports())
        self.f1_box2.clear()
        for port in port_list:
            self.com_list.append(port[0])
        print(self.com_list)
        self.f1_box2.addItems(self.com_list)
        # self.com_list = 0
        if len(self.com_list) == 0:
            self.f1_box2.addItem("no port")

    def port_info(self):
        if self.f1_box2 != '':
            self.f1_lab5.setText(self.f1_box2.currentText())

    def port_open(self):
        print('now port open')
        self.ser.port = self.f1_box2.currentText()
        self.ser.baudrate = int(self.f1_box3.currentText())
        try:
            self.ser.open()
        except:
            QMessageBox.critical(self, 'Port Error', "串口被占用!")
            return
        if self.ser.isOpen():
            self.f1_bt2.setEnabled(False)
            self.f1_bt3.setEnabled(True)
            self.timer.start(2)

    def port_close(self):
        self.timer.stop()
        try:
            self.ser.close()
        except:
            pass
        self.f1_bt2.setEnabled(True)
        self.f1_bt3.setEnabled(False)

    def send_data(self):
        if self.ser.isOpen():
            self.f2_text1.clear()
            line_msg = self.f3_line1.text()
            self.f3_line1.clear()
            # self.f2_text1.setText(line_msg)

            if line_msg !="":
                self.log_msg.append(line_msg)
                self.log_list.insert(0, line_msg)
                self.msg_index = 0
                line_msg = (line_msg + '\r\n').encode('utf-8')
                self.ser.write(line_msg)
        print(line_msg)
        print(self.log_msg)
        print(self.log_list)

    def receive_data(self):
        try:
            line_msg = self.ser.inWaiting()
        except:
            self.port_close()
            return
        if line_msg > 0:
            data = self.ser.read(line_msg)
            self.f2_text1.insertPlainText(data.decode('iso-8859-1'))
            textCursor = self.f2_text1.textCursor()
            textCursor.movePosition(textCursor.End)
            self.f2_text1.setTextCursor(textCursor)
        else:
            pass

    def keyPressEvent(self, event):
        print('press key')
        n = len(self.log_msg)
        if event.key() == Qt.Key_Up:
            if self.msg_index >= n:
                pass
            else:
                self.f3_line1.clear()
                self.f3_line1.setText(self.log_list[self.msg_index])
                self.msg_index += 1
        if event.key() == Qt.Key_Down:
            if self.msg_index < 0:
                self.msg_index += 1
                pass
            else:
                self.msg_index -= 1
                self.f3_line1.clear()
                self.f3_line1.setText(self.log_list[self.msg_index])
        else:
            pass

if __name__=='__main__':
    app = QApplication(sys.argv)
    ex = Example()
    app.exit(app.exec_())

实现效果:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值