Retroceder   Foros del Web > Programación para sitios web > Java y JSP

Respuesta
 
Herramientas Desplegado
Antiguo 27-abr-2007, 03:53   #1 (permalink)
antonkas ha deshabilitado el karma
 
Fecha de Ingreso: abril-2007
Mensajes: 5
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)
antonkas está desconectado   Responder Citando
Antiguo 30-abr-2007, 03:08   #2 (permalink)
elAntonie no se puede cailificar en este momento
 
Avatar de elAntonie
 
Fecha de Ingreso: febrero-2007
Mensajes: 278
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.


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

Última edición por elAntonie; 30-abr-2007 a las 03:14.
elAntonie está desconectado   Responder Citando
Antiguo 30-abr-2007, 09:02   #3 (permalink)
GreenEyed tiene algunos puntos positivos de karma
 
Fecha de Ingreso: octubre-2003
Mensajes: 2.570
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!
GreenEyed está desconectado   Responder Citando
Antiguo 03-may-2007, 02:26   #4 (permalink)
antonkas ha deshabilitado el karma
 
Fecha de Ingreso: abril-2007
Mensajes: 5
Busqueda 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.
antonkas está desconectado   Responder Citando
Antiguo 03-may-2007, 03:49   #5 (permalink)
elAntonie no se puede cailificar en este momento
 
Avatar de elAntonie
 
Fecha de Ingreso: febrero-2007
Mensajes: 278
Re: JAva rs-232

Cita:
Iniciado por antonkas Ver Mensaje
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???
elAntonie está desconectado   Responder Citando
Antiguo 03-may-2007, 06:03   #6 (permalink)
chuidiang tiene algunos puntos positivos de karma
 
Avatar de chuidiang
 
Fecha de Ingreso: octubre-2004
Mensajes: 751
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.
chuidiang está desconectado   Responder Citando
Antiguo 08-may-2007, 00:28   #7 (permalink)
GreenEyed tiene algunos puntos positivos de karma
 
Fecha de Ingreso: octubre-2003
Mensajes: 2.570
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!
GreenEyed está desconectado   Responder Citando
Antiguo 08-may-2007, 02:07   #8 (permalink)
antonkas ha deshabilitado el karma
 
Fecha de Ingreso: abril-2007
Mensajes: 5
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 {
antonkas está desconectado   Responder Citando
Antiguo 07-jun-2007, 01:23   #9 (permalink)
Kiku9 ha deshabilitado el karma
 
Fecha de Ingreso: junio-2007
Mensajes: 1
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
Kiku9 está desconectado   Responder Citando
Respuesta

No hay votos aún.


Herramientas
Desplegado

Normas de Publicación
No puedes crear nuevos temas
No puedes responder temas
No puedes subir archivos adjuntos
No puedes editar tus mensajes

BB code is Activado
Caritas están Activado
[IMG] está Desactivado
Código HTML está Desactivado


La Zona horaria es GMT -6. Ahora son las 14:32.


Message Board Statistics

LinkBacks Enabled by vBSEO 3.1.0

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93