2016-05-18 23 views
1

Ich löse node.js auf einem Raspberry Pi 3 (Debian).Wie LIBUSB_ERROR_BUSY auf Raspberry Pi (Debian) zu lösen Node.js

Ich habe ein kleines Prototyp-Projekt, das Daten von einem ANT + -Sender auf meinem Turbo-Trainer sammelt, der über einen Suunto Movestick USB-Dongle gesendet wird.

Ich verwende das Knotenmodul Ant-Plus, um das ANT + -Protokoll und ein Skript zu verwalten, das die Daten an die Konsole ausgibt und über die REST-API an den Cloud-Speicher sendet.

Wie auch immer, auf die Jagd schneiden, es war alles gut funktioniert, Start mehr Verfahren und hält ohne Probleme, bis ich den Prozess getötet versehentlich durch ctrl + z statt ctrl + c

Jetzt schlagen bekomme ich nur die folgende Fehlermeldung, wenn man versucht, mein Skript auszuführen:

/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) 

Es scheint, als hätte man, nachdem der Node-Prozess nicht ordnungsgemäß heruntergefahren wurde, festgestellt, dass ein Prozess immer noch mit dem USB verbunden ist.

Ich habe alle möglichen Arten versucht, den Prozess zu töten:

ps | grep <something> 
kill <somepid> 

killall node 

Irgendwie obwohl, ich glaube nicht, es ist der Knoten Prozess, den ich töten müssen, ich „fühlen“, wie ich irgendwie sauber zu müssen die USB-Schnittstelle, aber ich habe keine Ahnung, wie ich das machen würde.

Das Projekt verwendet die node-usb-Bibliothek, aber ich bin nicht sicher, ob das in irgendeiner Weise verwendet werden kann, um Dinge zu bereinigen.

Antwort

1

Ich habe einige Nachforschungen darüber gemacht: Der Grund ist, dass der Raspberry Pi einen Kernel-Treiber an verbundene Geräte anfügt. Sie müssen nach einem Kernel-Treiber suchen und ihn trennen, bevor Sie die Schnittstelle anfordern.

Sehen, wie Sie node-usb verwenden, hier einige Pseudo-Code:

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

Dank dafür, völlig die Antwort verpasst und nicht zurück zu dem Projekt für eine Weile! –