PyQT5学习之旅 2 封装一个PyQT5 串口模块,使用起来得心应手,我也开始造简单的轮子了。(文末带源码)

Posted 半颗心脏

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PyQT5学习之旅 2 封装一个PyQT5 串口模块,使用起来得心应手,我也开始造简单的轮子了。(文末带源码)相关的知识,希望对你有一定的参考价值。

在这里插入图片描述

PyQT5学习之旅第1篇 】 如何自定义控件,入门做一个上位电脑串口调试软件,全部开源。(附带源码)!
PyQT5学习之旅 第2篇 】封装一个PyQT5 串口模块,使用起来得心应手,我也开始造简单的轮子了。

前言

    貌似很久没更新博客了,又感觉自己在浑水摸鱼? 不可能的,我已经成功入坑了 PyQT5 上位机了,所以这几个月会陆陆续续更新一些好玩的上位机代码出来,这也是适合我们平时做量产工具所需要的。

    在选择上位机开发时候,我们都会在想,QTPyQt5C#哪个开发方式会适合商业用途? 个人觉得,在物联网领域,我们所做的功能并不多,用 PyQt5就够了,当然了,如果你精通 C#是最好的了,因为它是微软开发的语言,并且针对windows平台。

    我一向贯彻 “哪种方式开发最快使产品落地” 的开发方式为基准去要求自己,方式很多种,合适自己的才是最好的。平时不断地积累技术上的可量产的方案,并在简简单单的Demo中不断思考如何成为一个好产品。

    务实做好、学好每个技术点,自己撑起一把伞保护自己。


一、如何封装一个串口模块

     前面提到,学习就是一个探索到归纳并输出的过程,所以,当我学这个串口模块代码功能使用已经熟悉的地步时机,我会二次封装成为自己的代码习惯风格,下次沿用起来,非常得心应手去适配到自己现有的项目。

     设计规范

  1. 用户只需设计一个回调函数即可收到串口发来的数据,自行解析 Hex 格式还是字符串形式。
  2. 用户无需关心内部实现细节,采用接口形式设计串口。

     设计原理

在这里插入图片描述

二、重要的几个方法

  • 设置回调函数:setCallBack(funtion)
  • 获取可用的端口号集合:get_all_port()
  • 尝试关闭串口:try_off_port(port)
  • 尝试打开串口:try_port_open(port)
  • 设置校验位:set_default_parity(8)
  • 设置停止位:set_default_stopbits(8)
  • 设置数据位:set_default_bytesize(8)
  • 设置默认打开端口:set_default_port(port)
  • 设置默认打开波特率:set_default_baudrate(baud)

三、使用示范

import sys
from PyQt5 import QtWidgets
from xUart.UartSerial import *
from PyQt5.QtWidgets import QApplication, QMainWindow
from datetime import datetime

def uart_callback_handler(obj):
    if obj['code'] == 1:
        print('串口异常断开')
    else:
        buff = (obj['data'])
        now_time = datetime.now()  # 获取当前时间
        new_time = now_time.strftime('[%H:%M:%S]')  # 打印需要的信息,依次是年月日,时分秒,注意字母大小写
        if False:
            out_s = ''
            for i in range(0, len(buff)):
                out_s = out_s + '{:02X}'.format(buff[i]) + ' '
            print(new_time, '收到数据:', out_s)
        else:
            try:
                buff = buff.decode('utf-8', 'ignore')
                print(new_time, '收到数据:', buff)
            except:
                # 乱码显示
                pass

def OnClickSend():
    buff = "Hell World"
    mXUart.send_data(buff.encode('utf-8'))
    print("发送成功!!!")


if __name__ == '__main__':
    app = QApplication(sys.argv)

    MainWindow = QMainWindow()
    bt_send = QtWidgets.QPushButton(MainWindow)
    bt_send.setText("点击发送")
    bt_send.clicked.connect(OnClickSend)
    MainWindow.show()

    #  初始化mXUart
    mXUart = UartSerial()
    # 设置串口数据回调函数
    mXUart.setCallBack(uart_callback_handler)

    # 获取电脑可用的串口
    all_ports = mXUart.get_all_port()
    print("获取电脑可用的串口:", all_ports)

    # 设置通信串口
    get_port_array_str = []
    for item in all_ports:
        get_port_array_str.append(item)

    if len(get_port_array_str) == 0:
        print("获取电脑没有可用的串口!!!")
    else:
        # 设置通信串口,入参必须是字符串,比如 COM11
        baud = 115200
        port = get_port_array_str[0]
        str = '打开串口'

        # 设置打开串口参数
        mXUart.set_default_parity( 'N') # PARITY_NONE, PARITY_EVEN, PARITY_ODD, PARITY_MARK, PARITY_SPACE = 'N', 'E', 'O', 'M', 'S'
        mXUart.set_default_stopbits(1)  # STOPBITS_ONE, STOPBITS_ONE_POINT_FIVE, STOPBITS_TWO = (1, 1.5, 2)
        mXUart.set_default_bytesize(8)  # FIVEBITS, SIXBITS, SEVENBITS, EIGHTBITS = (5, 6, 7, 8)
        mXUart.set_default_port(port)
        mXUart.set_default_baudrate(baud)

        if str == '关闭串口':
            if mXUart.try_off_port(port, baud):
                print("关闭串口成功!!!")
            else:
                print('错误信息', '串口被占用或已拔开,无法打开')
        if str == '打开串口':
            if mXUart.try_port_open(port, baud):
                print("打开串口成功:", port)
            else:
                print('错误信息', '串口被占用或已拔开,无法打开')

    sys.exit(app.exec_())

日志打印:

获取电脑可用的串口: ['COM3', 'COM1', 'COM13']
打开串口成功: COM3
[22:43:52] 收到数据: AT+CWJAP="ai-iot","xuhongyss123456"
[22:43:53] 收到数据: AT+CWJAP="ai-iot","xuhongyss123456"
[22:43:55] 收到数据: AT+CWJAP="ai-iot","xuhongyss123456"
[22:43:56] 收到数据: AT+CWJAP="ai-iot","xuhongyss123456"
[22:43:58] 收到数据: AT+CWJAP="ai-iot","xuhongyss123456"
[22:43:59] 收到数据: AT+CWJAP="ai-iot","xuhongyss123456"

Process finished with exit code 0

四、开源一款串口调试助手:

在这里插入图片描述

    这是基于PyQt5打造的一款跨平台的安信可模组电脑串口调试助手 (支持windowsMacOSLinux),由 半颗心脏 一人的作品,兼容市面上的乐鑫芯片系列的模组的AT指令常见的网络通讯协议,包括 MQTT\\TCP\\UDP以及阿里云物联网平台连接小工具等,全面开源奉献物联网。

     集成了市面上大多串口工具的功能,特性包括:

  • 自定义波特率
  • 集成阿里云三元组一键生成MQTT鉴权参数
  • 集成乐鑫系列模组 AT指令的 MQTT、TCP、UDP快捷面板
  • 支持记录上次用户参数,包括用户全部自定义内容
  • RTS 控 DTR 控
  • Hex 发送和接收
  • 保存接收

下载免安装版:https://github.com/xuhongv/PyQT5-Serial/releases
源码下载:https://github.com/xuhongv/PyQT5-Serial

另外,不要把我的博客作为学习标准,我的只是笔记,难有疏忽之处,如果有,请指出来,也欢迎留言哈!

  • 玩转esp8266带你飞、加群QQ群,不喜的朋友勿喷勿加:434878850
  • 个人邮箱:xuhongv@yeah.net 24小时在线,有发必回复!
  • esp8266源代码学习汇总(持续更新,欢迎star):https://github.com/xuhongv/StudyInEsp8266
  • esp32源代码学习汇总(持续更新,欢迎star):https://github.com/xuhongv/StudyInEsp32
  • 关注下面微信公众号二维码,干货多多,第一时间推送!

在这里插入图片描述

以上是关于PyQT5学习之旅 2 封装一个PyQT5 串口模块,使用起来得心应手,我也开始造简单的轮子了。(文末带源码)的主要内容,如果未能解决你的问题,请参考以下文章

用pyqt5关闭窗口时如何关闭串口

如何在从串口python pyqt接收的textbrowser pyqt5上附加串行数据[重复]

pyqt5学习——pyqt5中.qrc资源文件的创建与编写

PyQt5中的信息打印,print 函数的重定向和再封装

PyQt5学习一---环境的安装和配置

pyqt5--学习资料