Armbian环境Node.js usb库调用attachKernelDriver报LIBUSB_ERROR_NOT_FOUND如何解决
这个LIBUSB_ERROR_NOT_FOUND错误是node-usb在Linux平台下操作内核驱动的常见问题,核心原因有两类:
- 你调用
attachKernelDriver()前,内核已经自动为该USB接口重新挂载了默认驱动,此时再主动调用挂载接口就会报找不到对应操作对象的错误 interface.release()操作未完全执行成功时就执行后续挂载操作,接口还处于被用户态占用的状态,无法完成驱动挂载
修复方案
- 调整释放流程的逻辑,先确认接口释放成功后,再判断内核驱动状态,避免重复挂载
- 为
attachKernelDriver()增加错误捕获,忽略预期内的LIBUSB_ERROR_NOT_FOUND报错 - 不要依赖固定延时执行释放操作,建议把释放逻辑放到
out.transfer()的回调里执行,确保传输完成后再释放接口 - 不要用
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
相关产品推荐
相关产品推荐

