要搞定硬件设备间的通信,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()
温馨提示:idVendor
和idProduct
这俩参数得根据你的实际设备改,可以用设备管理器或者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通信程序写起来就得心应手了。不过话说回来,硬件通信这块坑还是不少的,写代码时多测试,多容错,这样程序才能稳定运行。