Foros del Web » Programación para mayores de 30 ;) » Java »

manejo port serial con java

Estas en el tema de manejo port serial con java en el foro de Java en Foros del Web. Tengo una aplicación en java que lee bytes desde el port serial. Cada byte que lee debe procesarse (este proceso dura aproximadamente 150 milisegundos). Ningùn ...
  #1 (permalink)  
Antiguo 14/12/2006, 13:30
 
Fecha de Ingreso: febrero-2006
Mensajes: 57
Antigüedad: 18 años, 2 meses
Puntos: 0
manejo port serial con java

Tengo una aplicación en java que lee bytes desde el port serial. Cada byte que lee debe procesarse (este proceso dura aproximadamente 150 milisegundos). Ningùn byte depende de los otros. Los bytes llegan en cualquier momento y por segundo llegan 50 bytes. ¿Cómo puedo hacer para què, mientras proceso algunos bytes, no pierda los nuevos bytes que me llegan?
Estoy usando la api javax.com para ports seriales
Desde ya muchas gracias
  #2 (permalink)  
Antiguo 14/12/2006, 14:01
 
Fecha de Ingreso: octubre-2003
Mensajes: 3.578
Antigüedad: 20 años, 6 meses
Puntos: 51
Re: manejo port serial con java

La respuesta es usar Threads. Cada vez que recibes un byte lo pasas a una cola de "bytes pendientes de procesar" y una serie de Threads van leyendo de esa cola y los van procesando, no haciendo nada cuando no hay.

Tipico problema de productores/consumidores que se enseña en programacion concurrente, por si te sirve de referencia.

Nota: Crear un Thread para tratar cada byte no es una opcion recomendable, en caso de que alguien se pregunte por que no lo digo. El nº de Threads que uno puede crear es limitado, para no cascar el rendimiento del S.O. o la JVM, y es mejor controlar cuantos creamos.
  #3 (permalink)  
Antiguo 14/12/2006, 14:48
 
Fecha de Ingreso: febrero-2006
Mensajes: 57
Antigüedad: 18 años, 2 meses
Puntos: 0
Re: manejo port serial con java

Hola Green Eyed, desde ya agradezco tu respuesta.
Yo estoy usando dos hilos, un productor y otro consumidor (es el que procesa), y el monitor que tiene encolados los bytes no procesados encolados.
Mi duda es la siguiente:
para detectar que hay un byte en el port tengo
public void serialEvent(SerialPortEvent event).....que me notifica cuando hay un byte en el port. Que pasa si estoy procesando (en el consumidor) y antes de ponerse a dormir, me llegan dos bytes, con lo cual se perdería el primero que llegò.
public void serialEvent(SerialPortEvent event) es
try {
.........
.........

while (inputStream.available() > 0)
{
int numBytes = inputStream.read(readBuffer);

}
}


llegoDato=true;

datoLeido = readBuffer[0];

}

El tema es que los bytes me pueden llegar en cualquier momento.

Desde ya muchas gracias

Saludos
  #4 (permalink)  
Antiguo 14/12/2006, 15:02
 
Fecha de Ingreso: octubre-2003
Mensajes: 3.578
Antigüedad: 20 años, 6 meses
Puntos: 51
Re: manejo port serial con java

Lo que tienes que hacer es en el thread que recibe los datos, en cuanto reciba un byte pasarlo a una cola, que es de donde han de leer los consumidores. Los consumidores no han de leer los datos directamente de las estructuras que usa el productor, hay que usar un elemento, con acceso sincronizado, en el medio (una cola, pila o lo que sea que se necesite) para que las diferencias en velocidad de proceso no hagan bloqueos o se pierdan datos.

Y hay que sincronizar adecuadamente
  #5 (permalink)  
Antiguo 14/12/2006, 16:03
 
Fecha de Ingreso: febrero-2006
Mensajes: 57
Antigüedad: 18 años, 2 meses
Puntos: 0
Re: manejo port serial con java

Ahá, entiendo.....
Yo utilizo
- una clase monitor
- dos hilos:
* el productor (que deposita un byte de esa cola con un mètodo sincronizado del monitor)
* el consumidor (que extrae un byte de esa cola con otro mètodo sincronizado del monitor)

Productor
Cada vez que le llega un byte del port, lo manda a la cola del monitor y se pone a dormir
Llegan 50 bytes por segundo

Consumidor
Extrae un byte de la cola del monitor y lo procesa
El proceso consiste en 5 tareas: t1, t2, t3, t4, t5
El proceso dura 150 msg màs o menos
Para no perder bytes que lleguen al port, es suficiente poner un sleep entre cada tarea de este proceso?, o sea
t1
sleep
t2
sleep
t3
sleep
....

Cada tarea dura como 30 ms


Muchìsimas gracias por tu ayuda
GreenEyed
  #6 (permalink)  
Antiguo 15/12/2006, 01:22
 
Fecha de Ingreso: octubre-2003
Mensajes: 3.578
Antigüedad: 20 años, 6 meses
Puntos: 51
Re: manejo port serial con java

Normalmente no hay nadie que "duerma".

El productor suele quedarse "bloqueado" esperando a que lleguen mensajes/bytes del InputStream ( a veces se usa un read con timeout para no quedarse bloqueado indefinidamente, pero no es lo mismo que un sleep ).

El consumidor se queda bloqueado leyendo de la cola (usando la primitiva wait() ) y cuando el productor coloca algo en la cola, le avisa a través de la primitiva notify/notifyAll (si hay mas de uno).

Si usas Java 5, existen colas ya sincronizadas para estos menesteres, aunque yo no las he podido usar por que tengo que quedarme en 1.4 de momento. Esas nuevas utilidades de concurrencia de Java 5 ya tienen la parte de notificar, bloquearse etc implementada.
  #7 (permalink)  
Antiguo 15/12/2006, 12:06
 
Fecha de Ingreso: febrero-2006
Mensajes: 57
Antigüedad: 18 años, 2 meses
Puntos: 0
Re: manejo port serial con java

GreenEyed: muy buena ayuda.
Muchas gracias
Saludos
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta

SíEste tema le ha gustado a 1 personas (incluyéndote)




La zona horaria es GMT -6. Ahora son las 10:34.