2011-05-12 19 views
21

Me comunico con una unidad para controlar una antena de satélite a través de una conexión en serie.Java serialport cerrar bloques

Abrir una conexión con el dispositivo serie:

import gnu.io.CommPortIdentifier; 
import gnu.io.SerialPort; 

portIdentifier = CommPortIdentifier.getPortIdentifier(device); 
serialPort = (SerialPort) portIdentifier.open(name, 
serialPort.setSerialPortParams(baudrate, databits, stopbits, parity); 
serialPort.setFlowControlMode(flowMode); 

bufferedReader = new BufferedReader(new InputStreamReader(serialPort.getInputStream())); 
outputStream = serialPort.getOutputStream(); 

Si la unidad es de estar disponible, tengo que limpiar la corriente antes de poder enviar nuevos comandos, una vez que el dispositivo es nuevo. Pero este método claro en la secuencia de entrada/salida bloquea si el dispositivo está inactivo. También cerrando las transmisiones, o cerrando los bloques de SerialDevice.

¿Hay alguna manera de cerrar/borrar estas transmisiones o SerialDevice sin bloquear?

bufferedRead.close(); // blocks until device is up again 
outputStream.close(); // blocks until device is up again 
serialPort.close(); // blocks until device is up again 
+2

Hola Jürgen Hannärt, supongo que esta pregunta está desactualizada, pero utilicé (y sigo usando RXTX-API) - me funciona bien ... una solución para tu problema podría leer/escribir en un Seperate Thread, que dejaría el puerto libre para realizar operaciones cercanas en él. –

+0

@MartinFrank ¿cuál es el punto de leer/escribir en un hilo separado? las transmisiones aún no podrían borrarse después del apagado del dispositivo – mangusta

+1

o bien debería escuchar algún evento (si lo hubiera) asociado con el apagado del dispositivo o debería utilizar un bucle, al principio del cual, las transmisiones se borran. debería detectar el apagado del dispositivo (por ejemplo, 'null' u otro mensaje específico recibido en el flujo de entrada) y ese sería el final de la iteración del ciclo. nueva iteración comienza donde se llama a 'clear', pero se bloqueará hasta el próximo inicio, y cuando el dispositivo se inicie de nuevo, la iteración continuará hasta el próximo cierre – mangusta

Respuesta

3

He visto este puesto de tiempo, y he tenido el mismo problema cuando se utiliza el cierre serialport gnu.io paquete, que también se llama RXTX.

Esta no es una respuesta definitiva, sino una sugerencia de solución alternativa que encontré.

RXTX tiene dos problemas en mi opinión, si no más:

  1. Dependiendo de su IDE, es necesario colocar para Mac: RXTXcomm.jar y librxtxSerial.jnilib y para PC: RXTXcomm.jar, rxtxSerial.dll en la raíz del proyecto en su código IDE o Java, varía de IDE a IDE. La documentación aquí no cubre cómo hacerlo, y en diferentes IDE como NetBeans, IntelliJ incluso si lo tengo para trabajar tanto en Eclipse como en IntelliJ, pero no en NetBeans todavía. Todavía tiene otros problemas dolorosos.
  2. Dependiendo de su sistema operativo, incluso si obtiene este paquete y se ejecuta, en Windows 8.1 como ejemplo, tiene problemas para cerrar el puerto. Y la única solución es reiniciar su IDE/consola y reconectarse. Puede volverse loco al reiniciar su IDE cada vez que desarrolla un proyecto.

He pasado muchas horas buscando una solución y no hay una solución para cerrar el puerto correctamente tal vez para Windows 8.1 y posterior (no conozco otro problema de cierre del puerto), ya que el paquete es antiguo y el soporte es limitado.

Por lo tanto, sugiero pasar a un paquete más sin dolores de cabeza llamado JSSC.

Aquí es un simple lectura de datos desde el puerto serie utilizando JSSC:

public class Main { 

    public static void main(String[] args) { 
     SerialPort serialPort = new SerialPort("COM1"); 
     try { 
      serialPort.openPort();//Open serial port 
      serialPort.setParams(9600, 8, 1, 0);//Set params. 
      byte[] buffer = serialPort.readBytes(10);//Read 10 bytes from serial port 
      serialPort.closePort();//Close serial port 
     } 
     catch (SerialPortException ex) { 
      System.out.println(ex); 
     } 
    } 
} 

Y ya, que cierra el puerto con un problema a cabo.

Nota: Esta es una respuesta abierta, si alguien tiene experiencia relevante en relación con esto, por favor contribuir modificando la respuesta. He visto personas haciendo esta pregunta en Internet y teniendo casi el mismo problema con RXTX en general, y no han encontrado una solución viable para RXTX.

He respondido a otro tipo con similar anteriormente question en Stackoverflow.

Quería compartir el conocimiento que tengo, podría ser útil para aquellos que enfrentan el mismo problema. Podría hacer tu día menos doloroso.

Cuestiones relacionadas