PyUSB:一个USB通信神器,让设备连接更稳定的Python库!

文摘   2024-11-12 10:39   重庆  

要搞定硬件设备间的通信,USB绝对是个绕不开的话题。不过说实话,USB通信这玩意儿确实有点烦人,协议复杂不说,还得考虑各种异常情况。好在咱们Python有个特别给力的库 - PyUSB ,它让USB通信变得简单又可靠。


PyUSB这个库不是开箱即用的,得先装个USB后端。我一般用的是libusb,装起来也挺简单:


pip install pyusb

Windows用户还得额外装个libusb驱动,Mac和Linux用户就不用操心这个了。


连接USB设备的代码其实很简单,就那么几行:


import usb.core

import usb.util

# 找设备

dev = usb.core.find(idVendor=0x0483, idProduct=0x5740)

if dev is None:

    raise ValueError('咦?设备没找到啊')

# 设置配置

dev.set_configuration()

温馨提示:idVendoridProduct这俩参数得根据你的实际设备改,可以用设备管理器或者lsusb命令查。


USB通信最基本的就是收发数据了:


# 发送数据

dev.write(0x01, [0x01, 0x02, 0x03], timeout=1000)

# 接收数据

data = dev.read(0x81, 64, timeout=1000)

print(f“收到数据:{data.tolist()}”)

代码看着简单,但这里有个坑,timeout别设太小,不然容易出现通信超时。我之前就在这栽过跟头,设备明明在,就是收不到数据。


USB通信最怕啥?断连呗!所以异常处理必不可少:


try:

    dev.write(0x01, [0x01, 0x02, 0x03])

except usb.core.USBError as e:

    if e.args == ('Operation timed out',):

        print(“哎呀,超时了”)

    elif e.args == ('No such device',):

        print(“设备跑路了”)

    else:

        print(f“出错了:{e}”)

设备掉线后自动重连,这功能太实用了:


def auto_reconnect(max_attempts=3):

    for attempt in range(max_attempts):

        try:

            dev = usb.core.find(idVendor=0x0483, idProduct=0x5740)

            if dev:

                dev.set_configuration()

                print(“设备连上了!”)

                return dev

        except:

            print(f“重连中... {attempt + 1}/{max_attempts}”)

            time.sleep(1)

    return None

用PyUSB写通信程序比起直接用底层协议简单太多了,不过写的时候记得多打日志,USB通信出问题时,好查原因。要是觉得PyUSB功能不够用,还可以配合ctypes直接调用libusb的底层函数,那就更灵活了。


掌握了这些基础,USB通信程序写起来就得心应手了。不过话说回来,硬件通信这块坑还是不少的,写代码时多测试,多容错,这样程序才能稳定运行。

重庆城市TV
重庆广电城市TV旗下优质内容品牌,感谢您的关注!
 最新文章