You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

树莓派使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 18:45:00