He estado usando RXTX durante aproximadamente un año, sin demasiados problemas. Acabo de iniciar un nuevo programa para interactuar con una nueva pieza de hardware, así que reutilicé el método connect() que he usado en mis otros proyectos, pero tengo un problema extraño que nunca he visto antes.Problemas recibidos en RXTX
El problema
El dispositivo funciona bien, porque cuando me conecto con HyperTerminal, envío y recibo cosas lo que espero, y Serial Port Monitor (SPM) refleja esto.
Sin embargo, cuando ejecuto el clon de HyperTerminal simple que escribí para diagnosticar el problema que tengo con mi aplicación principal, los bytes se envían, según SPM, pero no se recibe nada, y mi SerialPortEventListener nunca se dispara. Incluso cuando verifico los datos disponibles en el ciclo principal, reader.ready()
devuelve false
. Si ignoro este cheque, recibo una excepción, detalles a continuación.
Sección pertinente del método connect()
// Configure and open port
port = (SerialPort) CommPortIdentifier.getPortIdentifier(name)
.open(owner,1000)
port.setSerialPortParams(baud, databits, stopbits, parity);
port.setFlowControlMode(fc_mode);
final BufferedReader br = new BufferedReader(
new InputStreamReader(
port.getInputStream(),
"US-ASCII"));
// Add listener to print received characters to screen
port.addEventListener(new SerialPortEventListener(){
public void serialEvent(SerialPortEvent ev) {
try {
System.out.println("Received: "+br.readLine());
} catch (IOException e) { e.printStackTrace(); }
}
});
port.notifyOnDataAvailable();
Excepción
java.io.IOException: Underlying input stream returned zero bytes
at sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:268)
at sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:306)
at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:158)
at java.io.InputStreamReader.read(InputStreamReader.java:167)
at java.io.BufferedReader.fill(BufferedReader.java:136)
at java.io.BufferedReader.read(BufferedReader.java:157)
at <my code>
La gran pregunta (de nuevo)
Creo que he eliminado todas las posibles problemas de hardware, entonces, ¿qué podría ser wro ng con mi código, o la biblioteca RXTX?
Editar: algo interesante
Al abrir HyperTerminal después de enviar un grupo de comandos de Java que debería haber conseguido respuestas, todas las respuestas aparecen inmediatamente, como si hubieran sido puestos en la memoria intermedia en algún lugar, pero no disponible.
Edición 2: probado algo nuevo, mismos resultados
me encontré el ejemplo de código encontró here, con los mismos resultados. No entraron datos, pero cuando cambié a un nuevo programa, todo se produjo de una vez.
Datos 3
El hardware está bien, e incluso un equipo diferente tiene el mismo problema. No estoy usando ningún tipo de adaptador USB.
Empecé a usar PortMon, también, y me está dando algunos resultados interesantes. HyperTerminal y RXTX no usan la misma configuración, y RXTX siempre sondea el puerto, a diferencia de HyperTerminal, pero aún no puedo ver qué ajustes afectarían esto. Tan pronto como pueda aislar la configuración de la encuesta constante, publicaré mis registros de PortMon.
Editar 4
¿Es posible que algún tipo de actualización de Windows en los últimos 3 meses podría haber causado esto? Ha estropeado uno de mis programas basados en MATLAB mex una vez.
Editar 5
También he notado algunas cosas que son diferentes entre HyperTerminal, RXTX, y un programa separado me encontré con que se comunica con el dispositivo (pero no hace lo que yo quiero, que es por qué estoy rodando mi propio programa)
- HyperTerminal - se establece a no control de flujo, pero RTS del puerto serie del monitor y los indicadores DTR son verdes
- Otro programa - no está seguro de qué ajustes se piensa que está utilizando, pero sólo El indicador RTS de SPM es verde
- RXTX: independientemente del control de flujo que configure, solo los indicadores CTS y DTR de SPM están encendidos.
De los archivos de serie del puerto de monitor de ayuda (parafraseado):
the indicators display the state of the serial control lines
RTS - Request To Send
CTS - Clear To Send
DTR - Data Terminal Ready
¿podría publicar el control de flujo que utilizó? gracias de antemano ... – Oso
Espero que esta edición ayude –
@drhorrible Veo cómo se establece el control de flujo en el objeto serialport. Eso esta limpio. Sin embargo, estoy tratando de averiguar cómo se detecta que el carácter de control de flujo ha sido enviado? Estoy usando XON XOFF vs RTS como tú. Sin embargo, supongo que debería ser similar. 0x13,0x11 son los caracteres que esperaría ver en el serialEvent que se activa? ¿Cómo pudiste detectar esto en el código? – ril3y