Software de representación de datos: Comunicación con el puerto serie

Java por defecto no incluye ninguna biblioteca para la comunicación por el puerto serie. No obstante existen diferentes bibliotecas que lo permiten, como la Java Communications 3.0 API, implementada por la propia SUN, la cual tiene como inconveniente que sólo funciona bajo Solaris SPARC y x86, y Linux x86. Es decir, usando esta biblioteca se pierde la característica más interesante de Java: la independencia de la plataforma en la que se trabaje. Además, el desarrollo de dicha biblioteca ha sido abandonado por SUN.

Por este motivo existe la biblioteca RXTXComm, de licencia libre LGPL, la cual provee de comunicación mediante el puerto serie y el paralelo al kit de desarrollo de Java (JDK, Java Development Toolkit). Esta biblioteca suple con creces el defecto de la anterior ya que se ha portado a un gran número de arquitecturas entre ellas las principales GNU/Linux, MacOSX y MSWindows.

Uso

En el wiki de la biblioteca hay diversos ejemplos muy claros acerca del uso de la misma. En concreto los ejemplos "Two way communcation with the serial port" y "Discovering comm ports" representan la funcionalidad requerida para el proyecto por lo que son de especial interés.

Instalación

Para la instalación de la biblioteca se recomienda leer el archivo INSTALL que se incluye con las mismas o, de forma más detallada, mirar el wiki.

Software de representación de datos: Obtención de los datos transmitidos para el procesado

Ya se ha visto que la comunicación con Java vía el puerto serie se traduce en un "stream" de bits que se obtienen en forma de vector de bytes. Los bytes enviados por el Maestro son sin signo y comprenden, en decimal, un número de entre 0 y 255. Sin embargo, en Java la naturaleza de los tipos es con signo y no existe ningún modificador para hacerlos sin signo (no existe el unsigned de C o C++). Esto implica que una conversión directa de el tipo byte a entero dará lugar a un número comprendido, en decimal, entre -128 y 127. Es por esto que la obtención para el procesado de los datos recibidos no es trivial.

Una solución para obtener el dato sin signo es realizar un cambio de tipos de manera que el valor recibido positivo se pueda expresar (esté contenido) en otro tipo. En nuestro caso, el tipo obtenido es un byte (255 como máximo) el cual se puede contener en un short ya que su longitud es de 2bytes por lo que comprende valores entre -32,768 y 32,767. De este modo, obtener un byte sin signo consiste en hacer una transformación de tipos con un enmascaramiento para no convertir el signo.

Entonces el código es el siguiente:

 
short UnsignedByte[] = new short[posicionNula];
        for (i=0;i<posicionNula;i++)
        {
            UnsignedByte[i]=(short)(0x00FF & mensaje[i]);
            PosMensaje=PosMensaje+(char)UnsignedByte[i];
        }

Donde

  • mensaje es el vector de bytes recibido.
  • posicionNula contiene la longitud del vector de bytes mensaje.
  • PosMensaje es mensaje representado como una cadena de caracteres o String. De este modo se puede representar en la consola.

Esta conversión de tipos es indeseable ya que se desperdicia espacio del reservado para cada tipo. No obstante es la mejor entre las posibles.1

Notas
1

En esta página muestran el mismo método de forma algo diferente. Además convierten distintos tipos a unsigned.

Referencias

SUN Microsystems The Java Tutorials.

SÁNCHEZ LÓPEZ M.; ALONSO BARBERÁN V. El lenguaje de programación Java.
Valencia: Servicio de publicaciones de la Universidad Politécnica de Valencia, 2003. 354 p.
ISBN:9788477215264