2009-09-08 19 views
6

Al tratar de averiguar this problem (se agradece cualquier ayuda), ejecuté RXTX mientras monitoreaba su actividad usando PortMon y noté que RXTX constantemente verifica si los datos están disponibles, incluso cuando el cliente Java lee desde el objeto gnu.io.SerialPort solo a través de SerialPortEventListener.¿Es necesario un sondeo constante en RXTX?

¿Por qué es esto? ¿Es una opción de implementación deficiente por parte de los usuarios de RXTX, una mala elección de API por parte de Sun (ya que RXTX sigue la API javax.comm), o una limitación de ejecutar Java soportado por código nativo?

Hiperterminal, por el contrario, no hace de votación (y funciona sin ningún problema). ¿Tiene acceso a algunas llamadas ocultas al sistema de Windows que le permiten hacer esto?

+1

El diseño de RXTX deja mucho que desear. Es posible que desee echar un vistazo a mi biblioteca alternativa: http://code.google.com/p/jperipheral/ – Gili

Respuesta

4

No, no es debido a la API javax.xomm. Rxtx puede usarse a través de esa API o no por cierto.

internos RXTX son un poco diferente/extraña y aunque tiene algunos errores. Versión corta, así es como se supone que funciona: Tiene dos parámetros para jugar: tiempo de espera y umbral. De acuerdo con el ajuste del código fuente el tiempo de espera a 0 (ninguno) y el umbral a 1 (que requiere al menos 1 byte antes de regresar) debería darnos normal, por InputStream definido, lecturas de bloqueo.

El problema es que incluso cuando su puesta en marcha como esto hay un error en la versión estable actual (2.1.7r2). El parámetro de umbral siempre se establece en 0! A partir del código fuente:

/* PRUEBA ttyset.c_cc [VMIN] = umbral; */ ttyset.c_cc [VMIN] = 0;

La parte confusa es que esto también fue el caso en 2004 e informó acerca de la lista de correo y fijo, sino que era o no realmente fijo o ha regresado de nuevo (una regresión). En realidad, hay un nuevo informe de error que por alguna razón no pude encontrar al principio. Eventualmente descubrí que iba a arrojar el código fuente del paquete de prelanzamiento y encontré un registro de cambios no publicado (la página web no muestra los registros de cambios después de la última versión estable, aunque está disponible en CVS).

Solución

  1. Se fija en la cabeza, para que pueda utilizar la última versión preliminar (2,2-series) o compilar desde CVS.
  2. Hacer una solución fea a lo largo de las líneas de:

    int read(InputStream in) throws IOException { 
        int b; 
        while ((b=in.read()) == -1) { 
        try { Thread.sleep(10); } catch (InterruptedException e) { } 
        } 
        return b; 
    } 
    

entonces usted: read(in) en lugar de in.read().

De hecho, me escribió hace a blog entry about this 2 años, así que no se olvide.