首页 > 编程问答 >Python:定期检测断开故障的USB设备并重新初始化实例

Python:定期检测断开故障的USB设备并重新初始化实例

时间:2024-07-22 12:35:34浏览次数:12  
标签:python usb pyserial

我有一个 USB 设备,有时会通过 USB 端口发送串行数据。问题是设备出现故障,有时会无缘无故地断开连接并再次连接到电脑。问题不大,但在这些情况下我需要重新初始化 serial.Serial(port) 实例,这有点烦人。该设备没有可以从我那里收到的任何命令,我可以验证它是否已连接。我可以编写一些东西来启动一个线程,定期监视设备或类似的东西,但这有点乏味,因为该设备与 Windows 和 Linux PC 一起使用,我需要考虑任何边缘情况和等等,这是相当烦人和乏味的工作。

是否有任何解决方案已经存在,我可以在其中附加一个回调来处理断开/连接事件或类似的解决方法?我正在寻找适用于 Windows 和 Linux 的解决方案(至少适用于 Windows)。购买新设备并不是解决方案。


遗憾的是,对于你的问题,没有现成的跨平台解决方案可以提供连接/断开连接回调。Windows 和 Linux 以不同的方式处理 USB 设备事件,并且没有统一的方法可以像你希望的那样直接获取通知。

不过,你可以使用多线程方法构建一个强大的解决方案。它可能没有看起来那么“乏味”。以下是如何做:

import serial
import time
from threading import Thread, Event

class UsbMonitor:
    def __init__(self, port, baudrate, reconnect_interval=5):
        self.port = port
        self.baudrate = baudrate
        self.reconnect_interval = reconnect_interval
        self.serial_port = None
        self.stopped = Event()
        self.monitor_thread = Thread(target=self._monitor_device)
        self.monitor_thread.daemon = True

    def _monitor_device(self):
        while not self.stopped.is_set():
            try:
                if self.serial_port is None or not self.serial_port.isOpen():
                    self.serial_port = serial.Serial(self.port, self.baudrate)
                    print(f"连接到 {self.port}")  # 或执行你需要的任何初始化
            except serial.SerialException:
                print(f"无法连接到 {self.port}. 重试中...")
            time.sleep(self.reconnect_interval)

    def start(self):
        self.monitor_thread.start()

    def stop(self):
        self.stopped.set()
        if self.serial_port:
            self.serial_port.close()
        self.monitor_thread.join()

# 用法示例:
usb_monitor = UsbMonitor(port="COM3", baudrate=115200)  # 在 Linux 上,使用 '/dev/ttyUSB0' 等
usb_monitor.start()

# 你的主程序逻辑
try:
    while True:
        # 使用 usb_monitor.serial_port 发送或接收数据
        # ...你的代码...
except KeyboardInterrupt:
    usb_monitor.stop()

说明:

  1. UsbMonitor 类:
  2. 处理连接、重新连接和断开连接逻辑。
  3. 使用一个单独的线程 ( _monitor_device ) 来定期检查 USB 设备的状态。
  4. 如果设备断开连接,它将尝试重新连接。
  5. 提供 start stop 方法来控制监视线程。

  6. 跨平台兼容性:

  7. 仅有的特定于平台的部分是串行端口名称(例如,Windows 上为“COM3”,Linux 上为“/dev/ttyUSB0”)。

  8. 自定义:

  9. 你可以根据需要调整 reconnect_interval
  10. _monitor_device 中,当建立连接时,你可以添加其他初始化步骤或触发回调。

  11. 主循环集成:

  12. 你的主程序逻辑可以继续运行,而监视线程处理连接管理。

  13. 错误处理:

  14. 该代码包括基本的错误处理,例如 serial.SerialException ,但这可以根据你的需要进一步增强。

这种方法通过封装连接管理提供了更干净的解决方案,使其更加健壮和用户友好。

标签:python,usb,pyserial
From: 78776940

相关文章

  • 【校招+社招】华为OD机试 - 拼接URL(Java、JavaScript、Python、C、C++)
    鱼弦:公众号【红尘灯塔】,CSDN博客专家、内容合伙人、新星导师、全栈领域优质创作者、51CTO(Top红人+专家博主)、github开源爱好者(go-zero源码二次开发、游戏后端架构https://github.com/Peakchen)算法概述URL拼接(URL拼接)是指将多个URL组件(方案、主机、端口、路径、查询参......
  • 使用 Google Colab 时,Python 包“datasets”从 virtualenv 目录“site-packages”中消
    我正在使用GoogleColab并尝试创建一个虚拟环境来工作。我的代码是:fromgoogle.colabimportdrivedrive.mount('/content/drive')!pipinstallvirtualenvmyenv_dir='/content/drive/MyDrive/virtual_env/'!virtualenv{myenv_dir}!chmod+x{myen......
  • Python 3 - openpyxl - 按名称迭代列
    使用openpyxl不按数字而是按列标题(ws第一行中的字符串值)迭代列的最简单方法是什么:如下所示:forcellinws.columns['revenue']:print(cell.value)不幸的是,openpyxl不直接支持像ws.columns['revenue']这样按列标题进行迭代。openpyxl......
  • Python selenium 网络抓取 recaptcha
    我想抓取一个网站,但在此之前有一个验证码,我什至使用api获取了数据,并且我还将其注入到网站中,因为网页没有提交按钮,我无法提交。流程是这样的,如果我解决同一网址中的验证码,隐藏的内容将被显示。但它并没有得到解决。我到处都找过了。我找不到解决方案。谁能帮我解决这个问题?......
  • Python 装饰器 详解+案例
    Python装饰器是一种特殊的函数,用于修改其他函数的功能。装饰器可以在不改变原函数代码的情况下,对函数进行增加、修改或者扩展功能。装饰器的语法形式是在函数定义前使用@符号,并在@后面加上装饰器的名称。装饰器函数接受被装饰函数作为参数,并返回一个修改后的函数。impo......
  • 如何在 vercel 部署中路由 python 和 typescript 无服务器函数
    我从一个带有Next.js和Typescript前端以及python后端的全栈应用程序开始。由于我们想在vercel上部署,因此我们将所有后端功能迁移到/api文件夹中的typescript函数中,可通过以下方式访问:fetch('api/**foldername**)问题是我有一个简单的pytorch模型,因此......
  • python中datetime模块
    datetime模块可以更方便的显示日期,并对日期进行计算。datetime模块中常用的类及其功能描述如下:datetime.datetime------>表示日期时间的类(常用)datetime.timedelta------>表示时间间隔的类(常用)datetime.date------>表示日期的类datetime.time------>表示时间的类datetime.......
  • Python - requests
    前言:介绍:安装及验证:使用:连续接口请求:传参方式: 前言:当你上班无聊的时候,你做什么,说实话有人让我写个requests的教程,教程我觉得网上已经有很多教程了,也很全面,我还是不要献丑了介绍:哎,我认为就是一个接口请求的仓库,不过requests属于第三方库,......
  • 如何判断USB设备与主机断开连接还是设备被主机挂起
    以CH592的CompoundDev例程为例,一、如果是在主机休眠/关机时被挂起,主机首先会下发USB_SET_FEATURE指令设置设备远程唤醒,紧接着发送USB_SUSPEND指令给从机设备。因此从机设备可根据先后顺序来判断是否被主机挂起,    二、设备如果意外掉线(USB线拔掉),则不会有USB_SET_FEATU......
  • Python学习计划——2.4列表推导式(List Comprehensions)
    列表推导式是Python的一种简洁且强大的语法,用于生成新的列表。它可以用更少的代码、更清晰的方式来创建列表,特别是在处理简单的循环和条件操作时。1.基本语法列表推导式的基本语法如下:[expressionforiteminiterable]expression:表达式,计算结果用于生成列表的元素。ite......