Problemas con el puerto Serie

lukax3
08 de Octubre del 2009
Hola a todos!
estoy intentando hacer una aplicacion JAVA para leer o escribir desde el puerto serie, y no consigo probar el programa de ejemplo de Sun SimpleRead.java. Puedo compilar y ejecutar, pero al ejecutarlo no pasa nada. Éste es mi código:

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

public class SimpleRead implements Runnable, SerialPortEventListener {
static CommPortIdentifier portId;
static Enumeration portList;

InputStream inputStream;
SerialPort serialPort;
Thread readThread;

public static void main(String[] args)
{
portList = CommPortIdentifier.getPortIdentifiers();
System.out.println("Justo antes de entrar en el WHILE");

try
{
while (portList.hasMoreElements())
{
portId = (CommPortIdentifier) portList.nextElement();
if (portId.getPortType() == CommPortIdentifier.PORT_SERIAL)
{
if (portId.getName().equals("COM1"))
{
//if (portId.getName().equals("/dev/term/a")) {
System.out.println("Creamos un objetoSimpleRead");
SimpleRead reader = new SimpleRead();
}
}
}
}
catch (Exception e)
{
System.out.println("Excepcion del WHILE");
e.printStackTrace();
}
}

public SimpleRead() {
try {
serialPort = (SerialPort) portId.open("SimpleReadApp", 2000);
} catch (PortInUseException e)
{
System.out.println("Excepcion en Constructor : PortInUse");
e.printStackTrace();
}
try {
inputStream = serialPort.getInputStream();
} catch (IOException e) {
System.out.println("Excepcion en Constructor : IO");
e.printStackTrace();
}
try {
serialPort.addEventListener(this);
} catch (TooManyListenersException e) {
System.out.println("Excepcion en Constructor : TooManyListeners");
e.printStackTrace();
}
serialPort.notifyOnDataAvailable(true);
try {
serialPort.setSerialPortParams(9600,
SerialPort.DATABITS_8,
SerialPort.STOPBITS_1,
SerialPort.PARITY_NONE);
} catch (UnsupportedCommOperationException e)
{
System.out.println("Excepcion en Constructor : UnsupportedCommOperation");
e.printStackTrace();
}
System.out.println("Inicializando el THREAD");
readThread = new Thread(this);
readThread.start();
}

public void run() {
try {
System.out.println("Esperando...");
Thread.sleep(200000);
} catch (InterruptedException e) {System.out.println("Excepcion en el RUN: Interrupted");

e.printStackTrace();}
}

public void serialEvent(SerialPortEvent event) {
switch(event.getEventType()) {
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;
case SerialPortEvent.DATA_AVAILABLE:
byte[] readBuffer = new byte[20];

try {
while (inputStream.available() > 0)
{
int numBytes = inputStream.read(readBuffer);
}
System.out.print(new String(readBuffer));
} catch (IOException e) {
System.out.println("Excepcion en el serialEvent: IO");
e.printStackTrace();}
break;
}
}
}
No me salta ninguna excepción ni nada, asi que si alguien puede ayudarme se lo agradecería mucho,
un saludo!

gustavo311
08 de Octubre del 2009
Al igual que tu yo soy principiante en java , sin embargo compile el codigo que tienes tu sin ningun problemas y al ejecutarlo funciona . Aun no le conecto ningun dispositivo , pro al ejecutarlo dice iniciando while ... y luego se queda esperando _ los datos . En internet encontre este codigo para la comunicacion con un dispositivo , haber si te sirve :

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

public class Bascula implements Runnable, SerialPortEventListener {
static String messageString = "P";
static SerialPort serialPort;
static OutputStream outputStream;
static CommPortIdentifier portId;
static Enumeration portList;
static InputStream inputStream;
static Thread readThread;

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

while (portList.hasMoreElements()) {
portId = (CommPortIdentifier) portList.nextElement();
if (portId.getPortType() == CommPortIdentifier.PORT_SERIAL) {

//-------------------ciclo
//-------------------escritura
if (portId.getName().equals("COM1")) {
try {
serialPort = (SerialPort)
portId.open("BasculaApp", 2000);
} catch (PortInUseException e) {}
try {
outputStream = serialPort.getOutputStream();
} catch (IOException e) {}
try {
serialPort.setSerialPortParams(9600,
SerialPort.DATABITS_8,
SerialPort.STOPBITS_1,
SerialPort.PARITY_NONE);
} catch (UnsupportedCommOperationException e) {}
try {
outputStream.write(messageString.getBytes());
} catch (IOException e) {}
//---------------fin escritura
//---------------parametros lectura
Bascula reader = new Bascula();
}
}
}

}

public Bascula() {
try {
serialPort = (SerialPort) portId.open("BasculaApp", 2000);
} catch (PortInUseException e) {}
try {
inputStream = serialPort.getInputStream();
} catch (IOException e) {}
try {
serialPort.addEventListener(this);
} catch (TooManyListenersException e) {}
serialPort.notifyOnDataAvailable(true);
try {
serialPort.setSerialPortParams(9600,
SerialPort.DATABITS_8,
SerialPort.STOPBITS_1,
SerialPort.PARITY_NONE);
} catch (UnsupportedCommOperationException e) {}
readThread = new Thread(this);
readThread.start();
}

public void run() {
try {
Thread.sleep(20000);
} catch (InterruptedException e) {}
}

public void serialEvent(SerialPortEvent event) {
switch(event.getEventType()) {
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;
case SerialPortEvent.DATA_AVAILABLE:
byte[] readBuffer = new byte[10];

try {
while (inputStream.available() > 0) {
int numBytes = inputStream.read(readBuffer);
}
System.out.print(new String(readBuffer));
} catch (IOException e) {}
break;
}
}

}
/*-----------------------------


valentinaroca
08 de Octubre del 2009
hola, ese codigo lo vi en una pagina y ami si me funciona, pero por si, buscalo y descargalo nuevamente, la pagina es http://www.itapizaco.edu.mx/paginas/JavaTut/froufe/fuentes/java1901.java
este escribe y con este lees
http://www.itapizaco.edu.mx/paginas/JavaTut/froufe/fuentes/java1902.java
recuerda que son dos computadores conectados por el puerto serial, y debes de corre java1901 en un pc y java1902 en el otro, me explico corres java1902 que lee, y luego corres java1901 que envia en el otro pc y listo.
Yo uni las dos clases en una sola te mando mi codigo a ver si lo puedes usar, solo ten en cuenta que yo manejo mi codigo desde un entorno swing pero la parte practica es parecida ...
Si no te funciona puedes escribirme a mi correo y con gusto te mando el codigo completo [email protected] Chaolin

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


public class Enviar implements Runnable,SerialPortEventListener {
CommPortIdentifier idPuerto;
Enumeration listaPuertos;
InputStream entrada;
OutputStream salida;
SerialPort puertoSerie;
Thread tLectura;
int nBytes;
Pantalla Pantalla1;


public void Enviar(Pantalla pantalla,int velocidad,int paridad,int intbits_parada,int numero_bits) {

this.Pantalla1=pantalla;
listaPuertos = CommPortIdentifier.getPortIdentifiers();

while( listaPuertos.hasMoreElements() ) {
idPuerto = (CommPortIdentifier)listaPuertos.nextElement();
if( idPuerto.getPortType() == CommPortIdentifier.PORT_SERIAL ) {
if( idPuerto.getName().equals("COM1") ) { // WINDOWS
// Lector del puerto, se quedará esperando a que llegue algo
// al puerto
try {
puertoSerie = (SerialPort)idPuerto.open( "AplLectura",2000 );
} catch( PortInUseException e ) {}
// Se obtiene un canal de entrada
try {
entrada = puertoSerie.getInputStream();
} catch( IOException e ) {}

try {
salida = puertoSerie.getOutputStream();
} catch( IOException e ) {}


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

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

// Se fijan los parámetros de comunicación del puerto
try {
puertoSerie.setSerialPortParams( velocidad,
numero_bits,
intbits_parada,
paridad);
} 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();
}
}
}
}

// metodo que recibe el mensaje y lo envia
void envia(String mensaje1){
try {
salida.write( mensaje.getBytes() );
} catch( IOException e ) {}

}

Alberto Gomez
08 de Octubre del 2009
Sobre Windows os falta el código que carga el driver antes de invocar a getPortIdentifiers:

String temp_string = \\\"C:\\\" + File.separator + \\\"j2sdk1.4.2_13\\\" + File.separator + \\\"lib\\\" + File.separator + \\\"javax.comm.properties\\\";
Method loadDriver_Method = CommPortIdentifier.class.getDeclaredMethod(\\\"loadDriver\\\", new Class[] {String.class});
loadDriver_Method.setAccessible(true);
loadDriver_Method.invoke(\\\"loadDriver\\\", new Object[] {temp_string});

Fijaos que hay que construir la ruta hacia el javax.comm.properties

Jhon V.
08 de Octubre del 2009
Hola alberto,
Yo tengo el mismo problema que giordina, intento enviar datos al puerto serial desde netbeans, y puedo, sin problemas, pero cuando intento hacerlo abriendo directamente el .jar en windows, no abre
y creo que es porque no puede abriar el puerto.

Te agradeceria si puedieras ayudarme

danius
08 de Octubre del 2009
Buenas todos.
Con respecto a lo del código para leer datos del puerto serie, he conseguido que me lea, pero el problema ahora es que lo que recibo son una secuencia de caracteres como el simbolo del euro,cuadraditos, etc etc.
No se porque pasa esto, pero en el programa lo que se va leyendo se mete en un array de byte y supongo que eso habra que pasarlo a algun otro fomato o algo de eso ¿no?.

Os agradecería mucho que me echarais una mano.
Gracias de antemano. Un saludo

CHAOOOOOO

Javi_822
08 de Octubre del 2009
Yo tengo el mismo problema. Hay varios programas de demo, y tanto sobre XP como sobre linux SUSE, me dice que no encuentra el nombre de puerto cuando arranco un programa llamado BlackBox del mismo paquete de software.
Con el SerialDemo me da una excepciop si le paso un fichero de conmfiguracion con el nombre de los dos com's.
¡Ah! Por supuesto con XP son COM1 y COM2, y con SUSE son /dev/ttyx.

A ver si alguien puede echar una ayudita.