树莓派使用PyUSB无法读取SLM-25分贝计的分贝数据应如何解决
解决方案
你的SLM-25属于USB HID类设备,无需通过ctrl_transfer走控制传输拉取数据,实时测量数据会通过你设备信息里标注的0x81中断IN端点主动上报,按以下步骤操作即可读取:
前置配置:解决权限和驱动冲突问题
- 先给普通用户开放设备访问权限:
新建/etc/udev/rules.d/99-slm25.rules文件,写入以下内容:
执行命令SUBSYSTEM=="usb", ATTRS{idVendor}=="10c4", ATTRS{idProduct}=="82cd", MODE="0666"sudo udevadm control --reload-rules && sudo udevadm trigger让规则生效,之后拔插一次声级计即可。 - 操作前要先卸载内核自带的HID通用驱动对设备的占用,否则PyUSB无法直接操控设备。
完整读取代码示例
import usb.core import usb.util import time # 设备对应的VID和PID VID = 0x10C4 PID = 0x82CD # 查找设备 dev = usb.core.find(idVendor=VID, idProduct=PID) if dev is None: raise ValueError("未检测到SLM-25声级计") # 卸载内核驱动占用 if dev.is_kernel_driver_active(0): dev.detach_kernel_driver(0) # 加载设备默认配置 dev.set_configuration() # 读取中断IN端点(对应你设备的0x81端点) endpoint = dev[0][(0,0)][0] try: while True: # 读取端点上报的数据,超时设为1000ms data = dev.read(endpoint.bEndpointAddress, endpoint.wMaxPacketSize, timeout=1000) # SLM-25默认分贝值存放在第3、4个字节,换算规则为 (第3字节*256 + 第4字节)/10 if len(data) >= 4: current_db = (data[2] * 256 + data[3]) / 10.0 print(f"当前测量值:{current_db:.1f} dB") time.sleep(0.5) except KeyboardInterrupt: print("已停止读取") finally: # 释放设备资源 usb.util.dispose_resources(dev)
异常排查
- 如果读取不到有效数值,先确认声级计已经开机并处于实时测量模式,部分型号需要手动按下测量启动键才会上报数据
- 如果提示权限错误,可临时用sudo运行脚本测试,确认udev规则配置正确
- 不同批次的设备数据偏移可能存在差异,你可以先打印完整的
data数组,对比设备屏幕显示的分贝值,调整对应换算的字节位置即可
内容的提问来源于stack exchange,提问作者Thanasisgnr
相关产品推荐
相关产品推荐

