Windows 11下读取TEMPerHUM USB温湿度设备数据的技术求助
Windows 11下读取TEMPerHUM USB温湿度设备数据的技术求助
我看到你在Windows 11下折腾TEMPerHUM USB温湿度设备时碰了不少钉子——Linux下能正常读取,但Windows上试了pyusb、wmi、libusb都没搞定,还碰到了「no backend available」的报错,虽然用WMI能定位到设备,但不知道怎么实际读出温湿度数据。我来给你分享几个实操方向和代码例子,应该能帮你解决问题:
一、先解决pyusb的「no backend available」问题
这个报错本质是pyusb找不到能和Windows USB栈交互的后端驱动,因为Windows默认给这类设备装的驱动不被libusb兼容,得先换驱动:
- 下载并打开Zadig工具,在设备列表里找到你的TEMPerHUM设备(可以通过VID_10C4&PID_3553来识别,也就是你代码里判断的ID)
- 选择「libusb-win32」作为目标驱动,点击「Install Driver」完成替换
- 重新安装pyusb确保环境正常:
pip install pyusb
搞定驱动后,用下面的pyusb代码就能尝试读取数据了:
import usb.core import usb.util # TEMPerHUM的固定VID和PID VID = 0x10C4 PID = 0x3553 # 定位设备 dev = usb.core.find(idVendor=VID, idProduct=PID) if not dev: raise ValueError("设备没找到!先检查驱动是否装对") # 解除Windows内核对设备的占用(如果有的话) if dev.is_kernel_driver_active(0): try: dev.detach_kernel_driver(0) except usb.core.USBError as e: print(f"没法解除内核驱动占用:{str(e)}") exit() # 激活设备配置 dev.set_configuration() # 找到数据输入端点(TEMPerHUM的输入端点一般是0x81) cfg = dev.get_active_configuration() intf = cfg[(0, 0)] ep = usb.util.find_descriptor( intf, custom_match=lambda e: usb.util.endpoint_direction(e.bEndpointAddress) == usb.util.ENDPOINT_IN ) if not ep: raise ValueError("找不到数据输入端点") # 读取并解析数据 try: data = ep.read(8) # TEMPerHUM通常一次返回8字节数据 # 按照设备协议解析温湿度 temperature = (data[2] << 8 | data[3]) / 10.0 humidity = (data[4] << 8 | data[5]) / 10.0 print(f"当前温度:{temperature}°C") print(f"当前湿度:{humidity}%") except usb.core.USBError as e: print(f"读取数据失败:{str(e)}")
二、试试更适合Windows的pywinusb库
如果pyusb还是有问题,可以试试pywinusb,它专门针对Windows的HID类设备做了优化,TEMPerHUM大多属于这类设备:
- 先安装库:
pip install pywinusb - 用下面的代码读取数据:
import pywinusb.hid as hid VID = 0x10C4 PID = 0x3553 # 定义数据回调函数,收到数据就解析打印 def handle_hid_data(data): if len(data) >= 6: temperature = (data[2] << 8 | data[3]) / 10.0 humidity = (data[4] << 8 | data[5]) / 10.0 print(f"温度:{temperature}°C | 湿度:{humidity}%") # 查找设备 target_devices = hid.find_all_hid_devices(vendor_id=VID, product_id=PID) if not target_devices: print("没找到TEMPerHUM设备") exit() device = target_devices[0] try: device.open() # 设置数据处理回调 device.set_raw_data_handler(handle_hid_data) print("正在实时读取数据,按Ctrl+C停止...") # 保持程序运行 while True: pass except Exception as e: print(f"运行出错:{str(e)}") finally: device.close()
三、关于你用的WMI代码
WMI只能帮你枚举和确认USB设备的存在,没法直接读取设备的温湿度数据——它的作用是帮你验证设备是否被Windows识别,就像你代码里做的那样,但真正的通信还是得靠pyusb、pywinusb这类USB/HID通信库。
注意事项
- 运行这些Python脚本时必须用管理员权限,否则Windows会阻止程序访问USB设备
- 用Zadig换驱动时,别选错设备,不然可能影响其他USB设备的正常使用
- 如果解析出来的温湿度不对,可能是设备的协议细节有差异,可以搜一下你这款TEMPerHUM的具体数据格式调整解析逻辑
内容来源于stack exchange
相关产品推荐
相关产品推荐

