【Python学习笔记(十)】串口被占用导致无法访问的解决办法

串口被占用导致无法访问的解决办法

前言

在项目开发中需要用到串口进行通讯,但当有其他串口调试工具、串口助手等打开占用了某一端口,打开串口时会导致程序卡死,针对这一问题的出现及解决过程进行记录。
图形界面开发:PySide2
串口操作:serial

正文

1、封装串口打开函数

# 串口打开函数
    def f_openCom(self, port, baudrate=9600, bytesize="8", stopbits="1", parity="N"):
        """
        function:  串口打开函数
              in:  port:串口名
                   baud:波特率
                   data:数据位
                   stop:停止位
                   parity:校验位
             out:  None
          return:  true:opened ; false,closed
          others:  open serial function
        """
        if self.serial.isOpen():  # 如果串口已经打开
            self.timer_send.stop()  # 关闭计时器
            self.f_closeCom()  # 关闭串口
            return self.serial.isOpen()  # 返回False
        else:  # 如果串口未打开
            # self.__m_Lock.acquire()
            self.__f_initCOM(port, baudrate, bytesize, stopbits, parity)  # 配置串口
            self.serial.timeout = 0.5  # 设置读超时时间为0.5s
            self.serial.open()  # 打开串口
            # self.__m_Lock.release()
            self.__m_thread_read = threading.Thread(target=self.f_comRead, args=(0.1,))  # 定义串口读取线程
            self.__m_thread_read.setDaemon(True)  # 设置该线程为守护线程,表示该线程是不重要的,进程退出时不需要等待这个线程执行完成。
            self.__m_thread_read.start()  # 线程开启
            return self.serial.isOpen()  # 返回True

大致实现的功能为:

  1. 判断串口是否打开;
  2. 如果打开,关闭串口,并停止接收缓存区的定时器;
  3. 如果未打开,则打开串口,并开启读取线程。
    完整的serial工具通讯类请参考该资源:串口通信通用类,基于Python和serial类实现,可以实现串口刷新、串口打开、串口关闭、串口数据接收、串口数据发送等功能

但在使用过程中发现,如果串口被其他的工具,如串口助手等打开占用,通过 serial.isOpen() 方法获取的都为 False ,所以当串口被占用的情况下通过 serial 打开串口,会导致 UI 界面的卡死。

2、解决过程

  1. serial 没有提供相关的方法可以对被其他程序占用的端口状态进行访问,所以想通过 serial 库本身来解决该问题无法实现;

  2. 通过查阅资料,网上的方法是通过创建串口,然后去收集是否会抛出异常来判断串口是否被占用,如python:检测windows上某串口(COM口)是否存在和被占用

  3. 根据2中的方法,在串口打开时使用 try except 语句去捕获异常,并通过 PySide2 的 QMessageBox 弹出提示框即可提示用户串口被占用。

                if self.ui.cbbSerial.currentText() != "":
                    try:
                        ir = self.rtu.f_openCom(self.ui.cbbSerial.currentText(),
                                                self.ui.cbbBaud.currentText(),
                                                self.ui.cbbData.currentText(),
                                                self.ui.cbbStop.currentText(),
                                                self.ui.cbbParity.currentText())
                    except Exception as e:
                        QMessageBox.critical(self.ui, "警告", f"{self.srl.port}被占用,拒绝访问!")
    

3、实现效果

在这里插入图片描述

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2023-12-29 19:14:02       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2023-12-29 19:14:02       101 阅读
  3. 在Django里面运行非项目文件

    2023-12-29 19:14:02       82 阅读
  4. Python语言-面向对象

    2023-12-29 19:14:02       91 阅读

热门阅读

  1. Unity Timer两种计时器

    2023-12-29 19:14:02       48 阅读
  2. android RecyclerView1.3.2与NestedScrollingParent的变化

    2023-12-29 19:14:02       57 阅读
  3. AI训练师常用的ChatGPT通用提示词模板

    2023-12-29 19:14:02       52 阅读
  4. js中三种URI编码方式比较

    2023-12-29 19:14:02       55 阅读
  5. GO语言工具函数库--Lancet

    2023-12-29 19:14:02       50 阅读
  6. php5.6安装mongo扩展

    2023-12-29 19:14:02       59 阅读
  7. 使用conda在Windows上建立虚拟环境

    2023-12-29 19:14:02       55 阅读
  8. 分享一波测试面试题(偏银行、信贷)

    2023-12-29 19:14:02       49 阅读
  9. 信息安全管理实践

    2023-12-29 19:14:02       62 阅读
  10. vue中的事件绑定的过程

    2023-12-29 19:14:02       50 阅读
  11. 备份文件..

    2023-12-29 19:14:02       48 阅读
  12. Docker构建zookeeper集群

    2023-12-29 19:14:02       54 阅读