Foros del Web

Foros del Web (http://www.forosdelweb.com/)
-   Java (http://www.forosdelweb.com/f45/)
-   -   JAva rs-232 (http://www.forosdelweb.com/f45/java-rs-232-a-485335/)

antonkas 27/04/2007 03:53

JAva rs-232
 
Hola:
quiero leer datos que me llegan desde la linea serie con java. he btenido el siguiente codigo pero me da errores si alguien me puede ayudar lo agradeceria.

public class Puerto_serie {
static CommPortIdentifier idPuerto;
FileOutputStream out;
File fitxategia;
int vaciado;
boolean jasotzen=false;
static Enumeration listaPuertos;
InputStream entrada;
String data,paketea="",gordetakoa="";
boolean bidalita=false,hutsik=false;
SerialPort puertoSerie;
Thread tLectura;
FileInputStream in;
int kontordua=0;
int ktrama=0;
byte[] ordua=new byte[8];
byte[] auxordua=new byte[8];
// En este ejemplo implementa un thread que es el que se encarga de
// que la aplicación se quede esperando en el puerto que se haya
// abierto a que se reciban datos.
// Primero abre el puerto y luego le fija los parámetros

public Puerto_serie() {

System.out.println("konstruktorera sartzen da?");
// Si el puerto no está en uso, se intenta abrir
try {
// puertoSerie = (SerialPort)idPuerto.open( "Puerto_serie",2000 );
puertoSerie = (SerialPort)idPuerto.open( "Puerto_serieApp",2000 );
System.out.println("linea seriea zabaldu da");
} catch( PortInUseException e ) {}
// Se obtiene un canal de entrada
try {
entrada = puertoSerie.getInputStream();
System.out.println("Sarrerako stream bat lortu da");
} catch( IOException e ) {}

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

// Hacemos que se nos notifique cuando haya datos disponibles
// para lectura en el buffer de la puerta
try {
//puertoSerie.addEventListener(SerialPortEventListen er);
puertoSerie.addEventListener((SerialPortEventListe ner)this);
// puertoSerie.addEventListener(this);

System.out.println("addEventlistener-era heldu naz");
} catch (TooManyListenersException e) {
// TODO
}
puertoSerie.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 );
System.out.println("linea seriea konfiguratu da");
} 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((Runnable)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 ) {
try{
fitxategia= new File("fitxategia.txt");//Portu serietik iristen diren datuak fitxategi honetan gordeko dira
out=new FileOutputStream (fitxategia,true);
in=new FileInputStream(fitxategia);
}catch(FileNotFoundException e){}


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[1];
try {
while( entrada.available() > 0 )
{
int nBytes = entrada.read( bufferLectura );
System.out.print( new String(bufferLectura,0,nBytes));
if(bufferLectura[0]=='1')
jasotzen=true;
if(((bufferLectura[0]!='U')&(bufferLectura[0]!='.')&(jasotzen==true))|(bufferLectura[0]=='\n')|(bufferLectura[0]=='\r'))
{
paketea=paketea+(new String(bufferLectura));
}
if( bufferLectura[0]=='.')
{
paketea=paketea+" ";
Date hoy= new Date();
data = hoy.toString();
System.out.println(data);
paketea=paketea+data;
paketea=paketea+".";
}
}

}catch( IOException e ) {}
}


}

public static void main( String[] args ) {
// Lista de los puertos disponibles en la máquina. Se carga en el
// mimo momento en que se inicia la JVM de Java

listaPuertos = CommPortIdentifier.getPortIdentifiers();
//System.out.println(listaPuertos);
//idPuerto = (CommPortIdentifier)listaPuertos.nextElement();
//System.out.println(idPuerto);
while( listaPuertos.hasMoreElements() ) {
System.out.println("while-era sartu naz");

idPuerto = (CommPortIdentifier)listaPuertos.nextElement();
System.out.println(idPuerto);
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
System.out.println(idPuerto.getName());
Puerto_serie lector;
lector = new Puerto_serie();

}
}


}

}
}
El error me da cuando lo ejecuto compilar lo hace bien.

java.lang.ClassCastException: proiektua.Puerto_serie
at proiektua.Puerto_serie.<init>(Puerto_serie.java:59 )
at proiektua.Puerto_serie.main(Puerto_serie.java:175)

elAntonie 30/04/2007 03:08

Re: JAva rs-232
 
Nada, no me hagas ni caso. El fin de semana jejejee.

**********************************************

Wenas.

Por lo que veo, no se si me equivoco, quieres hacer una clase que extienda de serialport??

puertoSerie = (SerialPort)idPuerto.open( "Puerto_serieApp",2000 );

Si es asi tendrias que poner el extends, sino esta linea que te he puesto estaria mal.

puertoSerie esta declarado como Puerto_serie no como SerialPort.


**********************************************

GreenEyed 30/04/2007 09:02

Re: JAva rs-232
 
Cita:

java.lang.ClassCastException: proiektua.Puerto_serie
Indica que es un error de classpath. Seguramente no lo tienes bien configurado a la hora de ejecutar el programa.

S!

antonkas 03/05/2007 02:26

Re: JAva rs-232
 
Gracias por responderme a los dos.
Al primero de los dos que me ha respondido puerto seie creo que lo tengo bien definido no?
SerialPort puertoSerie;
Respecto al segundo que de beria de poner en el classpath para solucionarlo?
Lo siento no haber podido contestar antes pero he estado el puente fuera.
Gracias por haberme contestado.

elAntonie 03/05/2007 03:49

Re: JAva rs-232
 
Cita:

Iniciado por antonkas (Mensaje 1991622)
Gracias por responderme a los dos.
Al primero de los dos que me ha respondido puerto seie creo que lo tengo bien definido no?
SerialPort puertoSerie;
Respecto al segundo que de beria de poner en el classpath para solucionarlo?
Lo siento no haber podido contestar antes pero he estado el puente fuera.
Gracias por haberme contestado.

Seguro que tienes el mismo classpath para compilarlo y para ejecutarlo???

chuidiang 03/05/2007 06:03

Re: JAva rs-232
 
Hola:

El problema del ClassCastException posiblemente venga de una linea como esta

puertoSerie = (SerialPort)idPuerto.open( "Puerto_serieApp",2000 );

que tienes en el constructor. Es posible que idPuerto.open() no devuelva una clase SerialPort. En concreto, según marca la excepción, el error está en el constructor en la línea 59 y debe ser un "cast" similar a ese, si no es ese.

Se bueno.

GreenEyed 08/05/2007 00:28

Re: JAva rs-232
 
Cita:

java.lang.ClassCastException: proiektua.Puerto_serie
La clase que no encuentra es la clase principal, así que es simplemente una cuestión de que no encuentra en el classpath las clases que has hecho. Puede ser por que están dentro de un paquete y no las tienes en un directorio con ese nombre, por ejemplo.

Estoy de viaje fuera, así que no puedo contestar más que intermitentemente :-)

S!

antonkas 08/05/2007 02:07

Re: JAva rs-232
 
He conseguido solucionar el problema, aqui os dejo la solucion. Añadiendo esta linea simplemente funciona.

public class proba2_serie implements Runnable,SerialPortEventListener {

Kiku9 07/06/2007 01:23

Re: JAva rs-232
 
Hola!

Recupero este tema ya que tengo una dudilla. Al igual que antonkas tengo ya el código Java para conectarme mediante rs232, pero mi problema es con el parámetro de los bits de datos (DATABITS_x). Quiero mandar 4 bits de datos y como al principio me daba fallos en la compilacion definí los parametros como variables INT con el valor que yo queria. Es decir:

final int dataBits=4;
final int stopBits=1;
final int parity=0;

[...]

puertoSerie.setSerialPortParams (9600,dataBits,stopBits,parity);


He estado mirandolo más, y me he dado cuenta de que en todos lados el menor valor que veo es DATABITS_5. Entonces, no puedo mandar menos de 5 bits??

La solución podría ser mandar el dato dos veces seguidas para que sea un byte entero, y luego coger sólo la mitad, pero si lo pudiera mandar tal cual... Que me comentais??

Gracias de antemano


La zona horaria es GMT -6. Ahora son las 07:28.

Desarrollado por vBulletin® Versión 3.8.7
Derechos de Autor ©2000 - 2026, Jelsoft Enterprises Ltd.