2016-05-18 3 views
1

Я запускаю node.js на малине pi 3 (debian).Как решить LIBUSB_ERROR_BUSY на Raspberry Pi (Debian) с помощью Node.js

У меня есть небольшой прототип проекта, который собирает данные от передатчика ANT + на моем турбо-тренажере, который отправляется через USB-ключ Suunto Movestick USB.

Я использую модуль узла Ant-Plus для управления протоколом ANT + и скриптом, который выводит данные на консоль и отправляет через REST API в облачное хранилище.

Во всяком случае, раскрой погони, все это было прекрасно работать, многократный запуск процесса и останавливается без проблем, пока я нечаянно не убил процесс, нажав ctrl + z вместо ctrl + c

Теперь я просто получаю следующее сообщение об ошибке, при попытке запустить мой сценарий:

/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 

иначе, хотя, я не думаю, что это процесс узла мне нужно убить, я «чувствую», что мне нужно как-то чистый интерфейс USB, но я не знаю, как это сделать.

Проект использует библиотеку node-usb, но я не уверен, может ли это каким-то образом очистить вещи.

ответ

1

Я изучал следующее: причина в том, что 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() 
}) 
+0

спасибо за это, полностью пропустил ответ и не вернулся в проект на некоторое время! –

Смежные вопросы