es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

No puede reclamar la interfaz USB más de 64 veces.

Tengo una aplicación que necesita mantener una conexión larga (indefinida) a un dispositivo USB e imprimir un número potencialmente ilimitado de veces en él. Por lo tanto, necesita hacer muchas reclamaciones en la misma interfaz del dispositivo.

Eventualmente, mi aplicación falla porque en la 65ª reclamación recibo un error LIBUSB_ERROR_ACCESS lanzado. ¿Es posible solucionarlo con node-usb? Posiblemente relacionado con:

  • https://github.com/libusb/libusb/issues/16
  • https://github.com/node-usb/node-usb/issues/302#issuecomment-988657538

Entorno y hardware


windows 11 home insider preview
nodejs v11.0.0
node-usb v1.5.0
node-escpos v2

Código

function testClaim() {
  const d = new USB();
  const p = new Printer(d, { encoding: 'Shift-JIS' });

  const loop = (curr = 0) => {
    console.log('LOOP', curr)

    if (curr === 50) {
      setTimeout(() => {
        d.open(() => d.reset(() => {
          console.log('RESET', curr)
          // no debería requerir que el usuario haga nada, necesita poder imprimir indefinidamente
          loop(0)
        }))
      }, 1000);
      return;
    }

    d.open(() => {
      p.close(() => {
        loop(curr + 1)
      })
    })
  }

  loop();
}

testClaim();
Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Con base en la información y el código proporcionados, parece que el problema está relacionado con el número máximo de reclamaciones que se pueden hacer en una interfaz USB. Esto no es específico de node-usb, sino más bien una limitación de la biblioteca subyacente libusb.

    El error LIBUSB_ERROR_ACCESS indica que la interfaz no está disponible para su reclamación, lo cual puede suceder si otro proceso ya la ha reclamado o si se ha alcanzado el número máximo de reclamaciones.

    Una posible solución a este problema es reiniciar periódicamente el dispositivo USB, lo cual liberaría todas las interfaces y permitiría que tu aplicación las reclame nuevamente. Esto se sugiere en los problemas de GitHub enlazados en la pregunta.

    En el código proporcionado, la función testClaim() ya incluye un paso de reinicio después de 50 reclamaciones. Sin embargo, parece que el reinicio no está liberando completamente la interfaz, lo que podría ser la razón por la que el error sigue ocurriendo en la reclamación número 65.

    Para solucionar este problema de manera más exhaustiva, puede ser útil implementar un manejo de errores y registros más detallado en el código, y verificar el estado de la interfaz USB antes de intentar reclamarla.

    En general, si bien es posible solucionar la limitación de reclamación de la interfaz utilizando node-usb y libusb, es importante tener en cuenta que esta es una limitación de hardware y de la biblioteca de bajo nivel que es posible que no se pueda evitar por completo.

Comments are closed.