如何在 Raspberry Pi (Debian) 运行 Node.js 上解决 LIBUSB_ERROR_BUSY
How to solve LIBUSB_ERROR_BUSY on Raspberry Pi (Debian) running Node.js
我正在 运行ning node.js raspberry pi 3 (debian)。
我有一个小原型项目,它从我的涡轮教练机上的 ANT+ 发射器收集数据,这些数据是通过 Suunto Movestick USB 加密狗发送的。
我正在使用 Ant-Plus
节点模块来管理 ANT+ 协议和一个将数据输出到控制台并通过 REST API 发送到云存储的脚本。
总之,切入正题,一切正常,多进程启动和停止都没有问题,直到我无意中通过点击 ctrl + z
而不是 ctrl + c
[=20 杀死了进程=]
现在我在尝试 运行 我的脚本时遇到以下错误:
/home/pi/ant-plus/node_modules/usb/usb.js:168
this.device.__claimInterface(this.id)
^
Error: LIBUSB_ERROR_BUSY
at Error (native)
at Interface.claim (/home/pi/ant-plus/node_modules/usb/usb.js:168:14)
at GarminStick2.USBDriver.open (/home/pi/ant-plus/build/ant.js:287:20)
at Object.<anonymous> (/home/pi/ant-plus/sample/cadence-sensor.js:39:12)
at Module._compile (module.js:409:26)
at Object.Module._extensions..js (module.js:416:10)
at Module.load (module.js:343:32)
at Function.Module._load (module.js:300:12)
at Function.Module.runMain (module.js:441:10)
at startup (node.js:139:18)
经过四处搜索,似乎由于节点进程未正常关闭,某些进程仍连接到 USB。
我试过各种方法杀进程:
ps | grep <something>
kill <somepid>
killall node
不过,我不认为这是我需要杀死的节点进程,我 "feel" 就像我需要以某种方式清理 USB 接口,但我不知道我该怎么做那。
该项目使用 node-usb 库,但我不确定是否可以通过某种方式使用它来清理内容。
我对此做了一些研究:原因是 Raspberry Pi
将内核驱动程序附加到连接的设备。在声明接口之前,您需要检查内核驱动程序并将其分离。
看到你正在使用 node-usb
,这里是一些伪代码:
device.open()
const deviceInterface = device.interfaces[0]
let driverAttached = false
if (printerInterface.isKernelDriverActive()) {
driverAttached = true
deviceInterface.detachKernelDriver()
}
deviceInterface.claim()
// ... use the device interface
deviceInterface.release(() => {
if (driverAttached) {
deviceInterface.attachKernelDriver()
}
device.close()
})
我正在 运行ning node.js raspberry pi 3 (debian)。
我有一个小原型项目,它从我的涡轮教练机上的 ANT+ 发射器收集数据,这些数据是通过 Suunto Movestick USB 加密狗发送的。
我正在使用 Ant-Plus
节点模块来管理 ANT+ 协议和一个将数据输出到控制台并通过 REST API 发送到云存储的脚本。
总之,切入正题,一切正常,多进程启动和停止都没有问题,直到我无意中通过点击 ctrl + z
而不是 ctrl + c
[=20 杀死了进程=]
现在我在尝试 运行 我的脚本时遇到以下错误:
/home/pi/ant-plus/node_modules/usb/usb.js:168 this.device.__claimInterface(this.id) ^
Error: LIBUSB_ERROR_BUSY
at Error (native)
at Interface.claim (/home/pi/ant-plus/node_modules/usb/usb.js:168:14)
at GarminStick2.USBDriver.open (/home/pi/ant-plus/build/ant.js:287:20)
at Object.<anonymous> (/home/pi/ant-plus/sample/cadence-sensor.js:39:12)
at Module._compile (module.js:409:26)
at Object.Module._extensions..js (module.js:416:10)
at Module.load (module.js:343:32)
at Function.Module._load (module.js:300:12)
at Function.Module.runMain (module.js:441:10)
at startup (node.js:139:18)
经过四处搜索,似乎由于节点进程未正常关闭,某些进程仍连接到 USB。
我试过各种方法杀进程:
ps | grep <something>
kill <somepid>
killall node
不过,我不认为这是我需要杀死的节点进程,我 "feel" 就像我需要以某种方式清理 USB 接口,但我不知道我该怎么做那。
该项目使用 node-usb 库,但我不确定是否可以通过某种方式使用它来清理内容。
我对此做了一些研究:原因是 Raspberry Pi
将内核驱动程序附加到连接的设备。在声明接口之前,您需要检查内核驱动程序并将其分离。
看到你正在使用 node-usb
,这里是一些伪代码:
device.open()
const deviceInterface = device.interfaces[0]
let driverAttached = false
if (printerInterface.isKernelDriverActive()) {
driverAttached = true
deviceInterface.detachKernelDriver()
}
deviceInterface.claim()
// ... use the device interface
deviceInterface.release(() => {
if (driverAttached) {
deviceInterface.attachKernelDriver()
}
device.close()
})