记录一下Python+PyQt5开发一个串口助手的过程(一)

第一次更新

前言说明

刚开始学习Python,利用业余时间开发一个适合自己的串口助手,也是学习Python的过程。

代码上传至 github仓库:访问请点击此处

环境说明

  1. 使用vscode-2019作为python的集成开发环境
  2. Python的版本为3.7
  3. PyQt5的版本为5.11.3
  4. pyserial的版本为3.4

环境搭建

自行百度根据上述版本搭建好环境。

UI的设计

咱先别一口吃成胖子,先把第一个界面完成。

  1. 在Qtdesigner中将界面设计成这个样子
    利用QT的设计器将界面设计成这样,这里先将高和宽固定,(还不知道怎么设计自适应大小。。)
  2. 使用pyuic5工具将界面生成python代码。
# -*- coding: utf-8 -*-

# Form implementation generated from reading ui file 'Main_form.ui'
#
# Created by: PyQt5 UI code generator 5.11.3
#
# WARNING! All changes made in this file will be lost!

from PyQt5 import QtCore, QtGui, QtWidgets

class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(720, 530)
        MainWindow.setMinimumSize(QtCore.QSize(720, 530))
        MainWindow.setMaximumSize(QtCore.QSize(720, 530))
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.groupBox = QtWidgets.QGroupBox(self.centralwidget)
        self.groupBox.setGeometry(QtCore.QRect(10, 10, 181, 211))
        self.groupBox.setObjectName("groupBox")
        self.layoutWidget = QtWidgets.QWidget(self.groupBox)
        self.layoutWidget.setGeometry(QtCore.QRect(10, 20, 161, 191))
        self.layoutWidget.setObjectName("layoutWidget")
        self.gridLayout = QtWidgets.QGridLayout(self.layoutWidget)
        self.gridLayout.setSizeConstraint(QtWidgets.QLayout.SetDefaultConstraint)
        self.gridLayout.setContentsMargins(5, 0, 4, 0)
        self.gridLayout.setSpacing(6)
        self.gridLayout.setObjectName("gridLayout")
        self.label_5 = QtWidgets.QLabel(self.layoutWidget)
        self.label_5.setObjectName("label_5")
        self.gridLayout.addWidget(self.label_5, 4, 0, 1, 1)
        self.comboBox_parity = QtWidgets.QComboBox(self.layoutWidget)
        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Fixed)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(self.comboBox_parity.sizePolicy().hasHeightForWidth())
        self.comboBox_parity.setSizePolicy(sizePolicy)
        self.comboBox_parity.setObjectName("comboBox_parity")
        self.comboBox_parity.addItem("")
        self.comboBox_parity.addItem("")
        self.comboBox_parity.addItem("")
        self.gridLayout.addWidget(self.comboBox_parity, 3, 1, 1, 1)
        self.label_4 = QtWidgets.QLabel(self.layoutWidget)
        self.label_4.setObjectName("label_4")
        self.gridLayout.addWidget(self.label_4, 3, 0, 1, 1)
        self.comboBox_stop_bits = QtWidgets.QComboBox(self.layoutWidget)
        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Fixed)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(self.comboBox_stop_bits.sizePolicy().hasHeightForWidth())
        self.comboBox_stop_bits.setSizePolicy(sizePolicy)
        self.comboBox_stop_bits.setObjectName("comboBox_stop_bits")
        self.comboBox_stop_bits.addItem("")
        self.comboBox_stop_bits.addItem("")
        self.comboBox_stop_bits.addItem("")
        self.gridLayout.addWidget(self.comboBox_stop_bits, 4, 1, 1, 1)
        self.comboBox_baud_rate = QtWidgets.QComboBox(self.layoutWidget)
        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Fixed)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(self.comboBox_baud_rate.sizePolicy().hasHeightForWidth())
        self.comboBox_baud_rate.setSizePolicy(sizePolicy)
        self.comboBox_baud_rate.setObjectName("comboBox_baud_rate")
        self.comboBox_baud_rate.addItem("")
        self.comboBox_baud_rate.addItem("")
        self.comboBox_baud_rate.addItem("")
        self.comboBox_baud_rate.addItem("")
        self.comboBox_baud_rate.addItem("")
        self.comboBox_baud_rate.addItem("")
        self.comboBox_baud_rate.addItem("")
        self.comboBox_baud_rate.addItem("")
        self.comboBox_baud_rate.addItem("")
        self.comboBox_baud_rate.addItem("")
        self.comboBox_baud_rate.addItem("")
        self.comboBox_baud_rate.addItem("")
        self.comboBox_baud_rate.addItem("")
        self.comboBox_baud_rate.addItem("")
        self.comboBox_baud_rate.addItem("")
        self.comboBox_baud_rate.addItem("")
        self.comboBox_baud_rate.addItem("")
        self.comboBox_baud_rate.addItem("")
        self.comboBox_baud_rate.addItem("")
        self.comboBox_baud_rate.addItem("")
        self.gridLayout.addWidget(self.comboBox_baud_rate, 1, 1, 1, 1)
        self.label_3 = QtWidgets.QLabel(self.layoutWidget)
        self.label_3.setObjectName("label_3")
        self.gridLayout.addWidget(self.label_3, 2, 0, 1, 1)
        self.label_2 = QtWidgets.QLabel(self.layoutWidget)
        self.label_2.setObjectName("label_2")
        self.gridLayout.addWidget(self.label_2, 1, 0, 1, 1)
        self.comboBox_data_bits = QtWidgets.QComboBox(self.layoutWidget)
        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Fixed)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(self.comboBox_data_bits.sizePolicy().hasHeightForWidth())
        self.comboBox_data_bits.setSizePolicy(sizePolicy)
        self.comboBox_data_bits.setObjectName("comboBox_data_bits")
        self.comboBox_data_bits.addItem("")
        self.comboBox_data_bits.addItem("")
        self.comboBox_data_bits.addItem("")
        self.comboBox_data_bits.addItem("")
        self.gridLayout.addWidget(self.comboBox_data_bits, 2, 1, 1, 1)
        self.label = QtWidgets.QLabel(self.layoutWidget)
        self.label.setObjectName("label")
        self.gridLayout.addWidget(self.label, 0, 0, 1, 1)
        self.pushButton_connect = QtWidgets.QPushButton(self.layoutWidget)
        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Fixed)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(self.pushButton_connect.sizePolicy().hasHeightForWidth())
        self.pushButton_connect.setSizePolicy(sizePolicy)
        self.pushButton_connect.setObjectName("pushButton_connect")
        self.gridLayout.addWidget(self.pushButton_connect, 5, 0, 1, 2)
        self.comboBox_Port = QtWidgets.QComboBox(self.layoutWidget)
        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Fixed)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(self.comboBox_Port.sizePolicy().hasHeightForWidth())
        self.comboBox_Port.setSizePolicy(sizePolicy)
        self.comboBox_Port.setObjectName("comboBox_Port")
        self.gridLayout.addWidget(self.comboBox_Port, 0, 1, 1, 1)
        self.gridLayout.setColumnStretch(0, 2)
        self.gridLayout.setColumnStretch(1, 4)
        self.groupBox_2 = QtWidgets.QGroupBox(self.centralwidget)
        self.groupBox_2.setGeometry(QtCore.QRect(10, 240, 181, 141))
        self.groupBox_2.setObjectName("groupBox_2")
        self.layoutWidget1 = QtWidgets.QWidget(self.groupBox_2)
        self.layoutWidget1.setGeometry(QtCore.QRect(11, 24, 151, 111))
        self.layoutWidget1.setObjectName("layoutWidget1")
        self.gridLayout_2 = QtWidgets.QGridLayout(self.layoutWidget1)
        self.gridLayout_2.setContentsMargins(0, 0, 0, 0)
        self.gridLayout_2.setObjectName("gridLayout_2")
        self.radioButton_rev_ascii = QtWidgets.QRadioButton(self.layoutWidget1)
        self.radioButton_rev_ascii.setObjectName("radioButton_rev_ascii")
        self.gridLayout_2.addWidget(self.radioButton_rev_ascii, 0, 0, 1, 1)
        self.radioButton_rev_hex = QtWidgets.QRadioButton(self.layoutWidget1)
        self.radioButton_rev_hex.setObjectName("radioButton_rev_hex")
        self.gridLayout_2.addWidget(self.radioButton_rev_hex, 0, 1, 1, 1)
        self.label_6 = QtWidgets.QLabel(self.layoutWidget1)
        self.label_6.setObjectName("label_6")
        self.gridLayout_2.addWidget(self.label_6, 1, 0, 1, 1)
        self.comboBox_rev_buff_size = QtWidgets.QComboBox(self.layoutWidget1)
        self.comboBox_rev_buff_size.setObjectName("comboBox_rev_buff_size")
        self.comboBox_rev_buff_size.addItem("")
        self.comboBox_rev_buff_size.addItem("")
        self.comboBox_rev_buff_size.addItem("")
        self.comboBox_rev_buff_size.addItem("")
        self.comboBox_rev_buff_size.addItem("")
        self.gridLayout_2.addWidget(self.comboBox_rev_buff_size, 1, 1, 1, 1)
        self.checkBox_save_file = QtWidgets.QCheckBox(self.layoutWidget1)
        self.checkBox_save_file.setObjectName("checkBox_save_file")
        self.gridLayout_2.addWidget(self.checkBox_save_file, 2, 0, 1, 2)
        spacerItem = QtWidgets.QSpacerItem(28, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
        self.gridLayout_2.addItem(spacerItem, 3, 0, 1, 1)
        self.pushButton_rev_clear = QtWidgets.QPushButton(self.layoutWidget1)
        self.pushButton_rev_clear.setObjectName("pushButton_rev_clear")
        self.gridLayout_2.addWidget(self.pushButton_rev_clear, 3, 1, 1, 1)
        self.groupBox_3 = QtWidgets.QGroupBox(self.centralwidget)
        self.groupBox_3.setGeometry(QtCore.QRect(10, 400, 181, 81))
        self.groupBox_3.setObjectName("groupBox_3")
        self.layoutWidget2 = QtWidgets.QWidget(self.groupBox_3)
        self.layoutWidget2.setGeometry(QtCore.QRect(11, 22, 151, 51))
        self.layoutWidget2.setObjectName("layoutWidget2")
        self.gridLayout_5 = QtWidgets.QGridLayout(self.layoutWidget2)
        self.gridLayout_5.setContentsMargins(0, 0, 0, 0)
        self.gridLayout_5.setObjectName("gridLayout_5")
        self.radioButton_send_ascii = QtWidgets.QRadioButton(self.layoutWidget2)
        self.radioButton_send_ascii.setObjectName("radioButton_send_ascii")
        self.gridLayout_5.addWidget(self.radioButton_send_ascii, 0, 0, 1, 1)
        self.radioButton_send_hex = QtWidgets.QRadioButton(self.layoutWidget2)
        self.radioButton_send_hex.setObjectName("radioButton_send_hex")
        self.gridLayout_5.addWidget(self.radioButton_send_hex, 0, 1, 1, 1)
        spacerItem1 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
        self.gridLayout_5.addItem(spacerItem1, 1, 0, 1, 1)
        self.pushButton_send_clear = QtWidgets.QPushButton(self.layoutWidget2)
        self.pushButton_send_clear.setObjectName("pushButton_send_clear")
        self.gridLayout_5.addWidget(self.pushButton_send_clear, 1, 1, 1, 1)
        self.line = QtWidgets.QFrame(self.centralwidget)
        self.line.setGeometry(QtCore.QRect(190, 0, 20, 481))
        self.line.setFrameShape(QtWidgets.QFrame.VLine)
        self.line.setFrameShadow(QtWidgets.QFrame.Sunken)
        self.line.setObjectName("line")
        self.groupBox_4 = QtWidgets.QGroupBox(self.centralwidget)
        self.groupBox_4.setGeometry(QtCore.QRect(220, 10, 491, 331))
        self.groupBox_4.setObjectName("groupBox_4")
        self.textBrowser_rev = QtWidgets.QTextBrowser(self.groupBox_4)
        self.textBrowser_rev.setGeometry(QtCore.QRect(0, 40, 481, 281))
        self.textBrowser_rev.setObjectName("textBrowser_rev")
        self.layoutWidget3 = QtWidgets.QWidget(self.groupBox_4)
        self.layoutWidget3.setGeometry(QtCore.QRect(320, 10, 151, 22))
        self.layoutWidget3.setObjectName("layoutWidget3")
        self.gridLayout_3 = QtWidgets.QGridLayout(self.layoutWidget3)
        self.gridLayout_3.setContentsMargins(0, 0, 0, 0)
        self.gridLayout_3.setObjectName("gridLayout_3")
        self.label_7 = QtWidgets.QLabel(self.layoutWidget3)
        self.label_7.setObjectName("label_7")
        self.gridLayout_3.addWidget(self.label_7, 0, 0, 1, 1)
        self.comboBox_encode = QtWidgets.QComboBox(self.layoutWidget3)
        self.comboBox_encode.setObjectName("comboBox_encode")
        self.comboBox_encode.addItem("")
        self.comboBox_encode.addItem("")
        self.comboBox_encode.addItem("")
        self.gridLayout_3.addWidget(self.comboBox_encode, 0, 1, 1, 1)
        self.gridLayout_3.setColumnStretch(0, 2)
        self.gridLayout_3.setColumnStretch(1, 3)
        self.groupBox_5 = QtWidgets.QGroupBox(self.centralwidget)
        self.groupBox_5.setGeometry(QtCore.QRect(220, 360, 491, 121))
        self.groupBox_5.setObjectName("groupBox_5")
        self.layoutWidget4 = QtWidgets.QWidget(self.groupBox_5)
        self.layoutWidget4.setGeometry(QtCore.QRect(22, 22, 461, 81))
        self.layoutWidget4.setObjectName("layoutWidget4")
        self.gridLayout_4 = QtWidgets.QGridLayout(self.layoutWidget4)
        self.gridLayout_4.setContentsMargins(0, 0, 0, 0)
        self.gridLayout_4.setObjectName("gridLayout_4")
        self.textEdit_send = QtWidgets.QTextEdit(self.layoutWidget4)
        self.textEdit_send.setObjectName("textEdit_send")
        self.gridLayout_4.addWidget(self.textEdit_send, 0, 0, 1, 1)
        self.pushButton_send = QtWidgets.QPushButton(self.layoutWidget4)
        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(self.pushButton_send.sizePolicy().hasHeightForWidth())
        self.pushButton_send.setSizePolicy(sizePolicy)
        self.pushButton_send.setMinimumSize(QtCore.QSize(70, 60))
        self.pushButton_send.setMaximumSize(QtCore.QSize(70, 60))
        self.pushButton_send.setObjectName("pushButton_send")
        self.gridLayout_4.addWidget(self.pushButton_send, 0, 1, 1, 1)
        self.line_2 = QtWidgets.QFrame(self.centralwidget)
        self.line_2.setGeometry(QtCore.QRect(220, 340, 491, 20))
        self.line_2.setFrameShape(QtWidgets.QFrame.HLine)
        self.line_2.setFrameShadow(QtWidgets.QFrame.Sunken)
        self.line_2.setObjectName("line_2")
        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QtWidgets.QMenuBar(MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 720, 23))
        self.menubar.setObjectName("menubar")
        MainWindow.setMenuBar(self.menubar)
        self.statusbar = QtWidgets.QStatusBar(MainWindow)
        self.statusbar.setSizeGripEnabled(True)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)

        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
        self.groupBox.setTitle(_translate("MainWindow", "串口设置"))
        self.label_5.setText(_translate("MainWindow", "停止位"))
        self.comboBox_parity.setItemText(0, _translate("MainWindow", "None"))
        self.comboBox_parity.setItemText(1, _translate("MainWindow", "Odd"))
        self.comboBox_parity.setItemText(2, _translate("MainWindow", "Even"))
        self.label_4.setText(_translate("MainWindow", "奇偶校验"))
        self.comboBox_stop_bits.setItemText(0, _translate("MainWindow", "1"))
        self.comboBox_stop_bits.setItemText(1, _translate("MainWindow", "1.5"))
        self.comboBox_stop_bits.setItemText(2, _translate("MainWindow", "2"))
        self.comboBox_baud_rate.setItemText(0, _translate("MainWindow", "custom"))
        self.comboBox_baud_rate.setItemText(1, _translate("MainWindow", "1200"))
        self.comboBox_baud_rate.setItemText(2, _translate("MainWindow", "2400"))
        self.comboBox_baud_rate.setItemText(3, _translate("MainWindow", "4800"))
        self.comboBox_baud_rate.setItemText(4, _translate("MainWindow", "9600"))
        self.comboBox_baud_rate.setItemText(5, _translate("MainWindow", "14400"))
        self.comboBox_baud_rate.setItemText(6, _translate("MainWindow", "19200"))
        self.comboBox_baud_rate.setItemText(7, _translate("MainWindow", "38400"))
        self.comboBox_baud_rate.setItemText(8, _translate("MainWindow", "56000"))
        self.comboBox_baud_rate.setItemText(9, _translate("MainWindow", "57600"))
        self.comboBox_baud_rate.setItemText(10, _translate("MainWindow", "115200"))
        self.comboBox_baud_rate.setItemText(11, _translate("MainWindow", "128000"))
        self.comboBox_baud_rate.setItemText(12, _translate("MainWindow", "230400"))
        self.comboBox_baud_rate.setItemText(13, _translate("MainWindow", "256000"))
        self.comboBox_baud_rate.setItemText(14, _translate("MainWindow", "460800"))
        self.comboBox_baud_rate.setItemText(15, _translate("MainWindow", "600000"))
        self.comboBox_baud_rate.setItemText(16, _translate("MainWindow", "750000"))
        self.comboBox_baud_rate.setItemText(17, _translate("MainWindow", "921600"))
        self.comboBox_baud_rate.setItemText(18, _translate("MainWindow", "1000000"))
        self.comboBox_baud_rate.setItemText(19, _translate("MainWindow", "1500000"))
        self.label_3.setText(_translate("MainWindow", "数据位"))
        self.label_2.setText(_translate("MainWindow", "波特率"))
        self.comboBox_data_bits.setItemText(0, _translate("MainWindow", "5"))
        self.comboBox_data_bits.setItemText(1, _translate("MainWindow", "6"))
        self.comboBox_data_bits.setItemText(2, _translate("MainWindow", "7"))
        self.comboBox_data_bits.setItemText(3, _translate("MainWindow", "8"))
        self.label.setText(_translate("MainWindow", "端口号"))
        self.pushButton_connect.setText(_translate("MainWindow", "连接"))
        self.groupBox_2.setTitle(_translate("MainWindow", "接收设置"))
        self.radioButton_rev_ascii.setText(_translate("MainWindow", "ASCII"))
        self.radioButton_rev_hex.setText(_translate("MainWindow", "HEX"))
        self.label_6.setText(_translate("MainWindow", "缓存大小"))
        self.comboBox_rev_buff_size.setItemText(0, _translate("MainWindow", "200K"))
        self.comboBox_rev_buff_size.setItemText(1, _translate("MainWindow", "500K"))
        self.comboBox_rev_buff_size.setItemText(2, _translate("MainWindow", "1M"))
        self.comboBox_rev_buff_size.setItemText(3, _translate("MainWindow", "2M"))
        self.comboBox_rev_buff_size.setItemText(4, _translate("MainWindow", "5M"))
        self.checkBox_save_file.setText(_translate("MainWindow", "接收数据到文件"))
        self.pushButton_rev_clear.setText(_translate("MainWindow", "清除接收区"))
        self.groupBox_3.setTitle(_translate("MainWindow", "发送设置"))
        self.radioButton_send_ascii.setText(_translate("MainWindow", "ASCII"))
        self.radioButton_send_hex.setText(_translate("MainWindow", "HEX"))
        self.pushButton_send_clear.setText(_translate("MainWindow", "清除发送区"))
        self.groupBox_4.setTitle(_translate("MainWindow", "接收"))
        self.label_7.setText(_translate("MainWindow", "编码格式"))
        self.comboBox_encode.setItemText(0, _translate("MainWindow", "UTF-8"))
        self.comboBox_encode.setItemText(1, _translate("MainWindow", "GB2312"))
        self.comboBox_encode.setItemText(2, _translate("MainWindow", "GDK"))
        self.groupBox_5.setTitle(_translate("MainWindow", "发送"))
        self.pushButton_send.setText(_translate("MainWindow", "发送"))


利用Pyserial设计自己的串口操作类

我们这个是串口助手,必然要使用串口的库进行操作串口,定义一个类,封装串口的各个操作。
创建一个com.py文件

import serial
import serial.tools.list_ports
import serial.serialutil
from queue import Queue

class com(object):
    """串口操作的封装"""
    def __init__(self):
        # 定义一个串口对象
        self.dev = None

        # 定义接收队列
        self.rx_queue = Queue()

        # 定义发送队列
        self.tx_queue = Queue()
        pass

    def com_scan(self):
        # 扫描端口并返回端口
        # 返回 串口设备对象
        dev_list = serial.tools.list_ports.comports()
        return dev_list

    def open(self, _port, _baudrate, _bytesize, _parity, _stopbits):
        if _parity == 'None':
            _parity = serial.serialutil.PARITY_NONE
        elif _parity == 'Odd':
            _parity = serial.serialutil.PARITY_ODD
        elif _parity == 'Even':
            _parity = serial.serialutil.PARITY_EVEN
        self.dev = serial.Serial(port=_port, baudrate=_baudrate, bytesize=_bytesize, parity=_parity, stopbits=_stopbits)

    def close(self):
        self.dev.close()
        self.dev = None

    def com_txHandler(self):

        # 由线程去调用,判断队列里是否有值并发送或者接收到队列里
        if self.dev == None:
            return
        
        if(not self.tx_queue.empty()):
            try:
                self.dev.write(self.tx_queue.get_nowait())
            except:
                return

    def com_rxHandler(self):
        try:
            read_data = self.dev.read()
        except:
            return
        
        self.rx_queue.put_nowait(read_data)

    def write(self, data):
        # date是byte类型的列表
        return self.tx_queue.put_nowait(data)

    def read(self, size):
        # 返回的是byte类型的列表
        read_data = []
        while(size):
            if not self.rx_queue.empty():
                read_data += self.rx_queue.get_nowait()
                size-=1
            else:
                break
        
        if len(read_data) == 0:
            return None
        else:
            return read_data


if __name__ == "__main__":
    from concurrent.futures import ThreadPoolExecutor
    import time

    def txhand(a):
        while(1):
            a.com_txHandler()
            time.sleep(0.01)
    def rxhand(a):
        while(1):
            a.com_rxHandler()
            time.sleep(0.01)

    threadPool = ThreadPoolExecutor(max_workers=2,thread_name_prefix='test_com_')

    dev = com()
    list = dev.com_scan()
    
    dev.open(list[0].device,115200,8,'None',1)

    future = threadPool.submit(txhand,dev)
    future1 = threadPool.submit(rxhand,dev)
    dev.write(bytes("haha",encoding='utf-8'))
    
    while(1):
        a = dev.read(10)
        if a != None:
            print(a)
            dev.write(a)
        time.sleep(0.01)

    
  1. 这里将串口操作设置为初始化,扫描端口,打开,关闭。
  2. 收发操作的话是封装出供线程调用的函数,将其扔进线程中,不用管让其接收数据到FIFO,从FIFO中发送数据。
  3. 注意:经过测试发现serial库中的read函数为阻塞接收。

暂时先到这,后续再添加界面逻辑代码。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Berte_Yu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值