Java - problema con comunicacion a traves de puerto serie

 
Vista:

problema con comunicacion a traves de puerto serie

Publicado por tor (2 intervenciones) el 14/12/2006 11:57:00
hola, estoy intentando enviar comandos a un router por el puerto serie y recojer la respuesta del mismo a traves del puerto serie, pero no consigo capturar la respuesta.

tengo el siguiente codigo:

import java.io.*;
import java.util.*;
import javax.comm.*;

public class pru implements Runnable,SerialPortEventListener{
static Enumeration listaPuertos;
static CommPortIdentifier idPuerto;

static String mensaje = "enable\n";
static String mensaje2 = "vlan show all\n";

static SerialPort puertoSerie;
static OutputStream salida;

InputStream entrada;
SerialPort puertoSerie2;

Thread tLectura;

public pru() {
// Si el puerto no está en uso, se intenta abrir
try {
puertoSerie2 = (SerialPort)idPuerto.open( "AplLectura",2000 );
} catch( PortInUseException e ) {}
// Se obtiene un canal de entrada
try {
entrada = puertoSerie2.getInputStream();
} catch( IOException e ) {}

// Añadimos un receptor de eventos para estar informados de lo
// que suceda en el puerto
try {
puertoSerie2.addEventListener( this );
} catch( TooManyListenersException e ) {}

// Hacemos que se nos notifique cuando haya datos disponibles
// para lectura en el buffer de la puerta
puertoSerie2.notifyOnDataAvailable( true );

// Se fijan los parámetros de comunicación del puerto
try {
puertoSerie.setSerialPortParams( 9600,
SerialPort.DATABITS_8,
SerialPort.STOPBITS_1,
SerialPort.PARITY_NONE );
puertoSerie2.setFlowControlMode(SerialPort.FLOWCONTROL_XONXOFF_IN);
} catch( UnsupportedCommOperationException e ) {}

// Se crea y lanza el thread que se va a encargar de quedarse
// esperando en la puerta a que haya datos disponibles
tLectura = new Thread( this );
tLectura.start();
}

public void run() {
try {
// En los threads, hay que procurar siempre que haya algún
// método de escape, para que no se queden continuamente
// bloqueados, en este caso, la comprobación de si hay datos
// o no disponibles en el buffer de la puerta, se hace
// intermitentemente
Thread.sleep( 20000 );
} catch( InterruptedException e ) {}
}

public void serialEvent( SerialPortEvent _ev ) {
switch( _ev.getEventType() ) {
// La mayoría de los eventos no se trata, éstos son los
// que se producen por cambios en las líneas de control del
// puerto que se está monitorizando
case SerialPortEvent.BI:
case SerialPortEvent.OE:
case SerialPortEvent.FE:
case SerialPortEvent.PE:
case SerialPortEvent.CD:
case SerialPortEvent.CTS:
case SerialPortEvent.DSR:
case SerialPortEvent.RI:
case SerialPortEvent.OUTPUT_BUFFER_EMPTY:
break;
// Cuando haya datos disponibles se leen y luego se
// imprime lo recibido en la consola
case SerialPortEvent.DATA_AVAILABLE:
byte[] bufferLectura = new byte[20];
try {
while( entrada.available() > 0 ) {
int nBytes = entrada.read( bufferLectura );
}
System.out.print( new String(bufferLectura) );
} catch( IOException e ) {}
break;
}
}

public static void main( String[] args ) {
listaPuertos = CommPortIdentifier.getPortIdentifiers();

while( listaPuertos.hasMoreElements() ) {
idPuerto = (CommPortIdentifier)listaPuertos.nextElement();
if( idPuerto.getPortType() == CommPortIdentifier.PORT_SERIAL ) {
// if( idPuerto.getName().equals("/dev/term/a") ) {
if( idPuerto.getName().equals("COM1") ) {
// Si el puerto no está en uso, se intenta abrir
try {
puertoSerie = ( SerialPort )idPuerto.open("AplEscritura",2000);
} catch( PortInUseException e ) { System.out.println("error");}

// Se obtiene un canal de salida
try {
salida = puertoSerie.getOutputStream();
} catch( IOException e ) {}

// Se fijan los parámetros de comunicación del puerto
try {
puertoSerie.setSerialPortParams( 9600,
SerialPort.DATABITS_8,
SerialPort.STOPBITS_1,
SerialPort.PARITY_NONE );
puertoSerie.setFlowControlMode(SerialPort.FLOWCONTROL_XONXOFF_IN);
} catch( UnsupportedCommOperationException e ) {}

// Se envía el mensaje
try {
salida.write( mensaje.getBytes() );
salida.write( mensaje2.getBytes() );
salida.close();
} catch( IOException e ) {}
}
}
}

while( listaPuertos.hasMoreElements() ) {
idPuerto = (CommPortIdentifier)listaPuertos.nextElement();
if( idPuerto.getPortType() == CommPortIdentifier.PORT_SERIAL ) {
// if( idPuerto.getName().equals("/dev/term/a") ) { // UNIX
if( idPuerto.getName().equals("COM1") ) { // WINDOWS
// Lector del puerto, se quedará esperando a que llegue algo
// al puerto
pru lector = new pru();
}
}
}

}
}

pero no consigo nada, a ver si alguien que controle mas sabe dnd esta el fallo

muchas gracias
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:problema con comunicacion a traves de puerto se

Publicado por Tom (1831 intervenciones) el 15/12/2006 13:10:44
Prueba a hacer salida.flush() tras cada salida.write();
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:problema con comunicacion a traves de puerto se

Publicado por tor (2 intervenciones) el 15/12/2006 13:41:00
el problema no es al escribir , que eso funciona bien (creo) , sino al leer

un saludo
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar