2016-05-18 5 views
1

Je lance node.js sur un Raspberry pi 3 (debian).Comment résoudre LIBUSB_ERROR_BUSY sur Raspberry Pi (Debian) en cours d'exécution Node.js

J'ai un petit projet prototype qui rassemble les données d'un émetteur ANT + sur mon turbo-formateur, qui est envoyé via une clé USB Suunto Movestick. J'utilise le module de noeud Ant-Plus pour gérer le protocole ANT + et un script qui envoie les données à la console et les envoie via l'API REST au stockage en nuage.

Quoi qu'il en soit, la coupe à la chasse, il était tout va bien, début de processus multiples de travail et arrête sans problème, jusqu'à ce que je involontairement tué le processus en frappant ctrl + z au lieu de ctrl + c

Maintenant, je viens d'obtenir l'erreur suivante, lorsque vous essayez d'exécuter mon script:

/home/pi/ant-plus/node_modules/usb/usb.js:168 ci.Dispositif .__ 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) 

Il semblerait, après avoir cherché autour de lui, qu'en raison du processus de nœud qui n'est pas arrêté correctement, un certain processus soit encore connecté à l'USB.

J'ai essayé toutes sortes de façons de tuer le processus:

ps | grep <something> 
kill <somepid> 

killall node 

D'une certaine manière cependant, je ne pense pas que ce soit le processus de nœud que je dois tuer, je « sens » comme je l'ai besoin d'une certaine façon propre l'interface USB, mais je ne sais pas comment je ferais cela.

Le projet utilise la bibliothèque node-usb, mais je ne suis pas sûr si je peux l'utiliser d'une certaine manière pour nettoyer les choses.

Répondre

1

J'ai fait des recherches sur ceci: La raison est que le Raspberry Pi attache un pilote de noyau aux périphériques connectés. Vous devez rechercher un pilote de noyau et le détacher avant de revendiquer l'interface.

Voyant que vous utilisez node-usb, voici un code pseudo:

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

grâce à cela, totalement manqué la réponse et n'ont pas été de retour au projet pendant un certain temps! –