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

Armbian环境Node.js usb库调用attachKernelDriver报LIBUSB_ERROR_NOT_FOUND如何解决

这个LIBUSB_ERROR_NOT_FOUND错误是node-usb在Linux平台下操作内核驱动的常见问题,核心原因有两类:

  • 你调用attachKernelDriver()前,内核已经自动为该USB接口重新挂载了默认驱动,此时再主动调用挂载接口就会报找不到对应操作对象的错误
  • interface.release()操作未完全执行成功时就执行后续挂载操作,接口还处于被用户态占用的状态,无法完成驱动挂载

修复方案

  1. 调整释放流程的逻辑,先确认接口释放成功后,再判断内核驱动状态,避免重复挂载
  2. 为attachKernelDriver()增加错误捕获,忽略预期内的LIBUSB_ERROR_NOT_FOUND报错
  3. 不要依赖固定延时执行释放操作,建议把释放逻辑放到out.transfer()的回调里执行,确保传输完成后再释放接口
  4. 不要用interface作为变量名,这是JavaScript保留字,容易引发潜在解析问题

修改后的参考代码

const usb = require("usb");
const elzabUSB = usb.findByIds(1155, 22336);

elzabUSB.open();

let targetInterface = elzabUSB.interfaces[1];
let isDriverDetached = false;

if (targetInterface.isKernelDriverActive()) {
    isDriverDetached = true;
    targetInterface.detachKernelDriver();
}

targetInterface.claim();

let outEndpoint = targetInterface.endpoints[0];
let cmd; // 待发送的数据

outEndpoint.transfer(cmd, function (err) {
    if (err) console.log(err);
    console.log("OK");
    // 传输完成后再执行释放逻辑
    targetInterface.release((releaseErr) => {
        if (releaseErr) {
            console.log('接口释放失败', releaseErr);
            elzabUSB.close();
            return;
        }
        try {
            // 挂载前先判断驱动是否已经被内核自动加载
            if (isDriverDetached && !targetInterface.isKernelDriverActive()) {
                targetInterface.attachKernelDriver();
            }
        } catch (attachErr) {
            // 仅忽略预期内的LIBUSB_ERROR_NOT_FOUND错误,其他错误正常打印
            if (attachErr.errno !== -5) {
                console.log('挂载驱动失败', attachErr);
            }
        } finally {
            elzabUSB.close();
        }
    });
});

内容的提问来源于stack exchange,提问作者Ares3000

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 05:09:02