Hola a todos,
estoy realizando una pequeña maqueta cuyo núcleo básico es una placa Arduino Duemilanove. La placa Arduino actua como interfaz entre el pc y dicha maqueta posibilitando la comunicación a través del puerto usb siguiendo un esquema petición - respuesta.
El problema consiste en que tras enviar y recibir la primera respuesta, todas las respuestas que recibo de arduino son las de la petición anterior o bien, las de la anterior más la actual. Por ejemplo, si la petición 1 tiene por respuesta 1, entonces, la petición 2 es respondida con 'respuesta1' o bien 'respuesta1 + respuesta2'.
Las causas probables pueden ser:
-
Error de programación: He revisado el código una y otra vez, cerrando todos los fujos de i/o abiertos, controlando tanto los bytes enviados como los recibidos hasta conformar un paquete válido.
-
Error en rxtx: Puede que al hacer fujo_entrada.read() no se actualice correctamente el buffer de entrada.
-
Error en arduino: me parece poco probable porque aparentemente todo funciona correctamente y a través del ide arduino las lecturas del puerto de serie son correctas, pero en él, no puedo implementar las peticiones de información sin cambiar todo el código de los paquetes (están codificados por bytes).
Ya he buscado por foros e internet previamente y no he conseguido encontrar información relativa a mi problema, todo apunta a un error en rxtx o algo que me falta decirle que haga, pero eso creo que sólo justifica el caso de las respuestas tipo 'respuesta1+respuesta2', y no la recepción de la respuesta de la petición anterior a la efectuada.
El formato de paquete es de 10 bytes, 2 de cabecera inicial, 2 de cabecera final y 6 de contenido:
0xF|0xE|byte|byte|byte|byte|byte|byte|0xE|0xF
Tras cada envío de petición, arduino envía un byte de respuesta como ack. El código de proceso de paquetes en java es el siguiente:
public byte[] recibir(int cabecera1, int cabecera2) throws ArduinoException, FormatoPaqueteException, TiempoRespuestaExcedidoExpcetion
-
{*
-
byte []paquete;*
-
byte []buffer;*
-
int bytes_en_buffer;*
-
buffer = new byte[128];*
-
bytes_en_buffer = 0;*
-
try*
-
{*
-
int num_intentos;*
-
boolean byte_anterior_es_de_cierre_de_cabecera;*
-
boolean se_ha_leido_paquete_completo;*
-
InputStream flujo_entrada;*
-
num_intentos = 0;*
-
byte_anterior_es_de_cierre_de_cabecera = false;*
-
se_ha_leido_paquete_completo = false;*
-
flujo_entrada = puerto_serie_conectado.getInputStream();*
-
do*
-
{*
-
int num_bytes_disponibles;*
-
num_bytes_disponibles = flujo_entrada.available();*
-
if (num_bytes_disponibles <= 0)*
-
{*
-
num_intentos++;*
-
}*
-
else*
-
{*
-
int byte_leido_int;*
-
byte byte_leido;*
-
byte_leido_int = flujo_entrada.read();*
-
byte_leido = (byte)byte_leido_int;*
-
if (bytes_en_buffer == 0)*
-
{*
-
if (byte_leido == cabecera1)*
-
buffer[bytes_en_buffer++] = byte_leido;*
-
else if (i_es_byte_descartable(byte_leido) == false)*
-
throw new FormatoPaqueteException("Formato paquete leido incorrecto.");*
-
}*
-
else if (bytes_en_buffer == 1)*
-
{*
-
if (byte_leido == cabecera2)*
-
buffer[bytes_en_buffer++] = byte_leido;*
-
else*
-
throw new FormatoPaqueteException("Formato paquete leido incorrecto.");*
-
}*
-
else*
-
{*
-
buffer[bytes_en_buffer++] = byte_leido;*
-
if (byte_leido == cabecera2)*
-
byte_anterior_es_de_cierre_de_cabecera = true;*
-
else if (byte_leido == cabecera1 && byte_anterior_es_de_cierre_de_cabecera == true)*
-
se_ha_leido_paquete_completo = true;*
-
else*
-
byte_anterior_es_de_cierre_de_cabecera = false;*
-
}*
-
}*
-
if (se_ha_leido_paquete_completo == false)*
-
{ *
-
if (num_intentos >= 4) *
-
throw new TiempoRespuestaExcedidoExpcetion("Número de reintentos excedido esperando respuesta de arduino.");*
-
else*
-
Thread.sleep(100);*
-
}*
-
} while (se_ha_leido_paquete_completo == false);*
-
flujo_entrada.close();*
-
}*
-
catch (IOException e)*
-
{ *
-
throw new ArduinoException(e.getMessage());*
-
} *
-
catch (InterruptedException e)*
-
{*
-
System.out.println(e.getLocalizedMessage());*
-
e.printStackTrace();*
-
throw new ArduinoException(e.getMessage());*
-
} *
-
paquete = new byte[bytes_en_buffer];*
-
for (int i = 0; i < bytes_en_buffer; i++)*
paquete = buffer*;*
* System.out.println("Paquete recibido: " + i_buffer_bytes_a_cadena(paquete, 0, paquete.length));*
* return paquete;*
* }*
Si alguien ha tenido un problema similar, agradecería su ayuda, por ahora lo he resuelto repitiendo las peticiones hasta obtener la respuesta adecuada y funciona, pero creo que hay una solución mejor ya que esta provoca retrasos innecesarios en la resolución de las peticiones.
Gracias por vuestra atención.