Está en la página 1de 10

Comunicaciones Serie RS-232 Anterior | Siguiente 1. Comunicaciones Serie RS-232 2. API de Comunicaciones Java 3. Principios Bsicos 4.

Uso del API de Comunicaciones Inicializacin del API con Puertos Serie Apertura y Acondicionamiento de Dispositivos Escritura y Lectura de Datos Cierre de Puertos 5. Conclusin Cap.Anterior | Cap.Siguiente

Quizs la ms popular de las conexiones que se realiza en un PC, sea la puerta serie, que permite al ordenador comunicarse con todo tipo de dispositivos perifricos: mdems, impresoras, escaners, lectores de cdigo de barras, etc. El API de Comunicaciones Java, constituido por el paquete javax.comm, que proporciona JavaSoft, no forma parte del JDK, pero aade soporte a Java para dispositivos serie y paralelo. En este captulo no se intenta realizar un compendio de comunicaciones serie, sino solamente proporcionar al lector una visin de cmo se utiliza el paquete javax.comm para comunicarse con un dispositivo serie RS-232 y poco ms. El paquete proporciona soporte para dispositivos serie y paralelo al estilo Java, es decir, utilizando una semntica semejante a la que se usa con streams y eventos. Para comunicarse con un dispositivo serie a travs de uno de los puertos serie de un ordenador, desde una aplicacin Java o un applet, es necesario un interfaz. El API de Comunicaciones Java, permite transmitir y recibir datos a travs de dispositivos conectados al puerto serie; proporcionando adems un conjunto de opciones que permiten la configuracin de todos los parmetros asociados a los puertos serie y paralelo. Este API es una proposicin para establecer un mtodo estndar de acceso a los puertos de comunicaciones, que permita a los autores de software de comunicaciones escribir programas Java independientes de plataforma. As se pueden escribir programas para emulacin de terminales, programas de fax, lectores de tarjetas, etc. El desarrollo de buenos programas normalmente pasa por construir unos cuantos interfaces claramente definidos. El diagrama de alto nivel de las capas que componen el API de comunicaciones Java es el que se reproduce en la figura:

Comunicaciones Serie RS-232 Lo primero que se va a describir es la comunicacin con un dispositivo serie basado en RS-232, presentando un pequeo ejemplo que utiliza el API. A diferencia de los drivers clsicos, que suelen venir con su propio modelo de eventos para control de las comunicaciones asncronas, el API de Comunicaciones Java proporciona un interfaz de control de eventos basado en el modelo de eventos utilizado por el lenguaje Java, paquete java.awt.event. Si se quiere saber si hay algn dato en el buffer de entrada, se puede realizar polling o quedarse a la escucha. Si se usa polling, el procesador comprueba peridicamente el buffer para ver si hay algn dato nuevo en l; en el otro mtodo, el procesador se queda a la espera de que se produzca un evento derivado de la entrada de nuevos datos en el buffer, ya que tan pronto como llega un nuevo dato al buffer, este enva una notificacin o evento al procesador. Entre los distintos protocolos serie existentes, dos de los estndares ms utilizados son el RS-232C y el RS-422, que definen los niveles elctricos de seal y el significado de las distintas lneas de estas seales. En comunicaciones serie de baja velocidad, los datos circulan coordinados por el reloj del ordenador, que proporciona los bits de arranque (start) y parada (stop). La nomenclatura RS-232 significa Recomended Standard 232, la C se refiere a la ultima revisin de ese estndar. Este estndar RS-232C especifica un conector Sub-D de 25 pines, de los cuales se utilizan 22. Muchos de ellos no son necesarios en las comunicaciones normales a travs de PC, por lo que estos van equipados con un conector Sub-D de 9 pines. Si el lector desea ms informacin sobre los puertos serie, puede consultar cualquier libro sobre el tema. La figura siguiente reproduce los tipos de conectores citados.

API de Comunicaciones Serie Anterior | Siguiente Este API proporciona a los programadores la siguiente funcionalidad:

Una especificacin completa para control y acceso a los puertos serie y paralelo. Esto facilita mucho los desarrollos, ya que disminuye en gran medida la carga de trabajo a realizar para el acceso a estos puertos. Control total de todos los parmetros de los puertos serie: velocidad en baudios, bits de stop, paridad, bits por trama; as como control manual o automtico de las lneas de control de flujo. Normalmente, en RS-232, hay dos lneas de seal y el resto son lneas de control; dependiendo del tipo de comunicacin, sncrona o asncrona, el nmero de lneas de control seleccionadas puede variar. El API proporciona acceso a las lneas de control fundamentales. En este momento, es necesario hacer una pequea descripcin para ayudar al lector a entender algo acerca de la paridad y los bits de arranque y parada. La paridad fue incorporada a RS-232 porque las lneas de comunicaciones podan ser ruidosas, es decir, si se mandaba el cdigo ASCII 0, que en hexadecimal es 0x30 (o 00110000 en binario), a lo largo de su viaje poda encontrarse con acciones de campos magnticos, por ejemplo, que hacan que alguno de sus bits cambiasen de valor. Para evitarlo, en vez de mandar 8 bits como sera normal, se incluye un bit ms a la cadena de bits enviada indicando si la suma total de bits enviados es par o impar, y... Esa es la paridad. Los bits de arranque (start) y parada (stop) fueron aadidos al protocolo de comunicaciones serie para permitir a los receptores sincronizarse con respecto a los caracteres que estn siendo enviados. La paridad, al usar un solo bit, no permite la correccin del error, solamente la deteccin. Las soluciones a este problema vienen de la mano de protocolos que forman una capa por encima del API de comunicaciones serie, normalmente utilizando protocolos de mensajes con checksums que permiten la deteccin de errores en grupos muy grandes de bits. Por ejemplo, cuando el lector se conecta son su proveedor de Internet sobre PPP, los paquetes que se intercambian son de 128 bytes por paquete con checksum, que si coincide en los dos lados, hay una seguridad del 99,999% de que lo enviado es lo recibido. Hay casos donde este esquema no funciona; por ejemplo, cuando se envan comandos crticos a dispositivos que estn muy, muy lejos (ms all del sistema solar). En estos casos se utilizan los protocolos forward correcting, porque no hay posibilidad de retransmisin de los paquetes y, adems, el espacio est repleto de ruido electromagntico.

Siguiendo con las funcionalidades del API de Comunicaciones Java. Este API utiliza para entrada y salida los streams, un concepto que debera ser ya familiar al lector. Es importante

reutilizar los conceptos de Java cuando se implementan nuevas funcionalidades o se corre el peligro de que los APIs resulten posteriormente muy complicados en su manejo. Los streams pueden extenderse para proporcionar control sobre el flujo y los umbrales. Por ejemplo, puede ser necesario lanzar un aviso cuando haya 15 caracteres en el buffer, o cuando solamente queden 15 espacios vacos para almacenar caracteres. El control del flujo es importante cuando dos dispositivos conectados a travs de un interfaz no pueden mantenerse uno al otro; sin el control del flujo, pueden darse condiciones alteradas, tanto por exceso como por defecto. En condiciones en que haya problemas por exceso de informacin, se recibirn datos mientras todava se estn procesando otros, con lo cual habr prdidas de informacin; y en el caso contrario, la informacin estar presente pero no disponible. Normalmente estas condiciones solamente se dan a nivel hardware, a nivel de la USART (Universal Synchronous Asynchronous Receiver Transmitter), que es el dispositivo fsico que convierte los bytes a una seal ondulada coincidiendo con la velocidad en baudios. El API de Comunicaciones Java utiliza el modelo de eventos que JavaSoft ha introducido desde el lanzamiento del JDK 1.1 para proporcionar informacin de las lneas de seal que van cambiando y del estado del buffer. Los cambios de estado se refieren solamente a las seales que estn bien definidas en el estndar RS-232; por ejemplo, la seal de deteccin de portadora (Carrier Detect) es utilizada por los mdems para indicar que se ha establecido la conexin con otro mdem, o para indicar que ha detectado un tono de llamada. Luego el hacer una conexin o detectar una llamada ser un evento. La deteccin de eventos y la notificacin de cambios est totalmente implementada en el API. Y ahora, es conveniente tambin, la revisin de algunas de las cosas que el API de Comunicaciones Java no hace, para que el lector tenga idea de lo que puede o no conseguir con su uso. Este API no proporciona ninguna de la siguiente funcionalidad.

Procesado de las seales, control de llamadas o control del mdem. El procesado de seales se refiere a procesado adicional de caracteres de entrada o salida; por ejemplo, una opcin muy comn de post-procesado es la conversin de los caracteres de retorno de carro a retorno de carro ms salto de lnea, cuyo origen se remonta a los antiguos teletipos, ya que ahora con las pantallas grficas y las impresoras lser, esto tiene menos importancia. El control de llamadas y del mdem se puede realizar con aplicaciones adicionales que tambin se pueden desarrollar con el API de Comunicaciones Java. El control de llamadas, normalmente, es lo que proporciona un interfaz para los comandos AT de los mdem. Este interfaz suele venir documentado en los manuales del mdem. Un ejemplo facilitar la comprensin de este concepto al lector. Se parte de que se tiene un mdem conectado al puerto COM1 y que se quiere marcar un nmero de telfono. La aplicacin Java del control de llamadas preguntar el nmero de telfono que se quiere marcar e interrogar al mdem; estos comandos son manejados por el API, que no realiza ninguna interpretacin de ellos. Es decir, para marcar el numero 608123456, el controlador de llamadas enviar un AT y se quedar esperando OK, cuando lo reciba enviar ATDT608123456. Uno de los cometidos principales de estas aplicaciones de control es el tratar los errores y timeouts que se puedan producir

durante la comunicacin.

Un interfaz grfico para el control de los puertos serie. Normalmente, el lector habr observado que los puertos serie disponen de una ventana de dilogo que permite su configuracin, pudiendo especificar la velocidad, paridad, etc. El diagrama que muestra la figura siguiente describe los objetos involucrados en la lectura o escritura de datos en un puerto serie desde Java.

Soporte para protocolos de mdem, del tipo X, Y o Z. Estos protocolos proporcionan soporte para la deteccin y correccin de errores.

Principios Bsicos Con demasiada frecuencia, los programadores se involucran en un proyecto y codifican interactivamente con un API a travs del editor sin haber reflexionado suficientemente sobre el problema que intentan resolver. Para evitar confusiones y potenciales problemas, el programador debera recoger la informacin, cuando se trate de comunicacin con dispositivos serie externos, que se indica seguidamente antes de iniciar ese proyecto. Recuerde tambin el lector, que todos los dispositivos requieren en algn momento que se deba consultar su manual, que para eso el fabricante lo ha escrito; no es suficiente con la intuicin. 1. Coger el manual del dispositivo y leer la seccin sobre el interfaz RS-232 y su protocolo. Muchos dispositivos tienen un protocolo que debe seguirse, para poder establecer comunicacin entendible con l. El dispositivo decodificar los datos que sigan ese protocolo, as que hay que poner atencin en el envo y recepcin de datos. Con una inicializacin

correcta no se asegura que la comunicacin tambin lo sea, por ello hay que tomarse el tiempo necesario en hacer las pruebas que sea menester, incluso haciendo una aplicacin de lo ms simple, que escriba y lea datos a travs del puerto serie usando el API de Comunicaciones Java. 2. Consultar los ejemplos que proporcione el fabricante; incluso aunque se encuentren en otro lenguaje de programacin, siempre resultan tiles. 3. Buscar o codificar el ejemplo ms simple posible para verificar la comunicacin con el dispositivo. En el caso de dispositivos serie, esto puede resultar altamente frustante cuando se enva algo al dispositivo conectado al puerto serie y no sucede nada. Este es el resultado que se obtiene cuando las condiciones de la lnea son incorrectas. La regla numero Uno de la programacin con dispositivos (a no ser que se est escribiendo un driver) es asegurarse de que se puede establecer comunicacin con el dispositivo. 4. Si el protocolo es muy complicado, hay que considerar el uso de algn tipo de software que analice la lnea RS-232, el cual permite comprobar los datos que se intercambian los dos dispositivos sin interferir en la transmisin. El uso del API de Comunicaciones Java con xito en una aplicacin requiere proporcionar algn tipo de interfaz para el control del dispositivo utilizando el API como mecanismo de transmisin. En otras palabras, con excepcin de los dispositivos ms simples, se necesita una capa por encima para formatear los datos de forma que sean entendibles por el dispositivo. Desde luego, el protocolo ms simple es ninguno, es decir, la no existencia de protocolo, en donde los datos se envan y reciben sin ningn tipo de interpretacin. Uso del API de Comunicaciones Anterior | Siguiente Adems de proporcionar un protocolo, el modelo ISO de comunicaciones utilizado por TCP/IP tambin se aplica en este caso en que hay una capa elctrica, teniendo por encima una capa muy simple de transporte de bytes. Por ejemplo, la pila PPP puede utilizar el API de Comunicaciones Java para la transferencia de bytes al mdem, tanto en un sentido como en otro. El trabajo con la capa de Comunicaciones es realmente poco cuando se usa en este contexto, las tareas a realizar seran: 1. Proporcionar al API de Comunicaciones Java control sobre alguno de los dispositivos. Antes de usar un dispositivo, el API debe conocerlo. 2. Abrir el dispositivo y acondicionar la lnea a la velocidad, paridad, etc. que se requiera. 3. Escribir o leer algunos datos siguiendo el protocolo especificado para el dispositivo. Por ejemplo, si hay que comunicarse con una impresora, se pueden enviar los cdigos de inicio y fin de trabajo. 4. Cerrar el puerto. A continuacin se vern estos pasos detalladamente, con ejemplos de cdigo de la forma de realizar estas tareas. Inicializacin del API con puertos serie El API de Comunicaciones Java solamente puede controlar puertos de los cuales tenga conocimiento.

En la ltima versin que JavaSoft ha proporcionado de este API, no es necesario que se inicialicen los puertos, ya que en el arranque, el API realiza una bsqueda de los puertos disponibles en la mquina en que se ejecuta y los va incorporando automticamente. Se pueden inicializar los puertos serie que se vayan a utilizar en la aplicacin, y en caso de que la nomenclatura de los dispositivos no siga la convencin habitual, se pueden aadir explcitamente utilizando cdigo semejante al que se reproduce a continuacin.
// Registro del dispositivo CommPort ttya = new javax.comm.solaris.SolarisSerial( "ttya","/dev/ttya" ) CommPort!denti"ier.addPort( ttya,CommPort!denti"ier.P#R$%S&R!'( ) CommPort tty) = new javax.comm.solaris.SolarisSerial( "tty)","/dev/tty)" ) CommPort!denti"ier.addPort( tty),CommPort!denti"ier.P#R$%S&R!'( )

Apertura y Acondicionamiento de Dispositivos El cdigo que aparece a continuacin muestra como se aade, fijan las caractersticas y abre un dispositivo; si el lector necesita detalles especficos sobre los parmetros de las llamadas a los mtodos, debe remitirse a la documentacin del API. El ejemplo fija un dispositivo serie determinado para que sea accesible con el nombre ControlPuertoSerie. El dispositivo conectado a esta lnea tiene una velocidad de 9600 baudios, 1 bit de parada, 8 bits por carcter y no dispone de paridad, y lo que se pretende es proporcionar dos canales, o streams, uno para leer y otro para escribir en el dispositivo conectado a este puerto.
!np*tStream entrada = n*ll #*tp*tStream salida SerialPort p*ertoSerie = n*ll p*)lic ControlP*ertoSerie( String dispositivo,int )a*dios,int timeo*t ) t+rows &xception , CommPort!denti"ier idP*erto = CommPort!denti"ier.getPort!denti"ier( dispositivo ) p*ertoSerie = (SerialPort)idP*erto.openPort( "P*ertoSerie",timeo*t ) p*ertoSerie.setSerialPortParams( -.//,SerialPort.0'$'1!$S%2, SerialPort.S$#P1!$S%3,SerialPort.P'R!$4%5#5& ) p*ertoSerie.set6lowcontrol7ode( SerialPort.6(#8C$R(%5#5& ) p*ertoSerie.ena)leRcv$+res+old( 3 ) p*ertoSerie.ena)leRcv$imeo*t( timeo*t ) System.o*t.println( "0ispositivo Serie a)ierto" ) salida = p*ertoSerie.get#*tp*tStream() entrada = p*ertoSerie.get!np*tStream()

Escritura y Lectura de datos En el caso del API de Comunicaciones Java, la lectura y escritura no se diferencia en nada de cualquier llamada a mtodos semejantes para realizar estas mismas tareas en objetos derivados del uso de streams. Para escribir, se puede hacer:

try , salida.write( arraySalida,/,longit*d )

Y para la lectura de datos, es suficiente con hacer:


try , int ) = entrada.read()

El ejemplo java1901.java, es un ejemplo muy simple que permite escribir por el primer puerto serie de la mquina en que se est ejecutando.
import java.io.9 import java.*til.9 import javax.comm.9 p*)lic class java3-/3 , static &n*meration listaP*ertos static CommPort!denti"ier idP*erto static String mensaje = "$*torial de :ava, Com*nicaciones Serie;n" static SerialPort p*ertoSerie static #*tp*tStream salida p*)lic static void main( String<= args ) , listaP*ertos = CommPort!denti"ier.getPort!denti"iers() w+ile( listaP*ertos.+as7ore&lements() ) , idP*erto = (CommPort!denti"ier)listaP*ertos.next&lement() i"( idP*erto.getPort$ype() == CommPort!denti"ier.P#R$%S&R!'( ) , i"( idP*erto.get5ame().e>*als("/dev/term/a") ) , i"( idP*erto.get5ame().e>*als("C#73") ) , // Si el p*erto no est? en *so, se intenta a)rir try , p*ertoSerie = ( SerialPort )idP*erto.open("'pl&scrit*ra",@///) A catc+( Port!nBse&xception e ) ,A // Se o)tiene *n canal de salida try , salida = p*ertoSerie.get#*tp*tStream() A catc+( !#&xception e ) ,A // Se "ijan los par?metros de com*nicaciCn del p*erto try , p*ertoSerie.setSerialPortParams( -.//, SerialPort.0'$'1!$S%2, SerialPort.S$#P1!$S%3, SerialPort.P'R!$4%5#5& ) A catc+( Bns*pportedComm#peration&xception e ) ,A // Se envDa el mensaje try , salida.write( mensaje.get1ytes() ) A catc+( !#&xception e ) ,A

//

A A A A

Y el ejemplo java1902.java, es la contrapartida, una aplicacin tambin muy simple, que permite leer toda la informacin que llegue a travs del primer puerto serie de la mquina en que se este ejecutando; como lo nico que interesa es la lectura de datos, no se tienen en cuenta ninguno de los eventos que generan las dems seales de control del puerto, solamente aquella que indica que hay datos disponibles para leer. Cierre de Puertos El cierre de los puertos con este API de Comunicaciones no es distinto a otras peticiones de cierre de dispositivos; aunque en este caso, el cierre es un paso sumamente importante porque el API de Comunicaciones Java siempre intenta proporcionar acceso exclusivo a los dispositivos, y si algn canal no se cierra, no estar disponible para otras aplicaciones. Si se quiere utilizar un dispositivo para mltiples usuarios sobre una misma lnea serie, es necesario emplear un protocolo que permita multiplexar la informacin proveniente de cada uno de ellos.
try , entrada.close() salida.close() A ...

Conclusin Ahora bien, se puede plantear el problema de que el lector tiene a su disposicin un ordenador con puertos serie, y un dispositivo que quiere conectar a travs de uno de los puertos, pero no dispone de la implementacin del driver correspondiente, y el fabricante todava no la tiene disponible, solamente proporciona, en el manual del dispositivo, una somera informacin de cmo se podra acceder al dispositivo a travs de llamadas realizadas en C. Y el problema que se plantea es cmo, a travs del uso de javax.comm se puede utilizar este dispositivo especial. La respuesta pasa por implementar un interfaz que se comunique con ese dispositivo a travs de mtodos nativos. Habra que comprobar el comportamiento del API de Comunicaciones Java ante grandes avalanchas de datos o aplicaciones en tiempo real, en donde s se puede valorar la bondad de API. No obstante esa duda, la aproximacin tan disciplinada que proporciona este API de Comunicaciones har mucho ms sencilla la integracin de cualquier dispositivo serie como lectores de cdigos de barras, impresoras, lectores de tarjetas, y cientos de otros dispositivos. Tambin es verdad que hay otros APIs de Java que se apoyan en este API de Comunicaciones; por ejemplo, si el lector necesita desarrollar una aaplicacin que utilice tarjetas inteligentes, puede utilizar un API ya definido como OpenCard Framework, o comunicarse directamente utilizando javax.comm; e incluso, usando javax.smartcard, que hace uso de javax.comm. Como recomendacin final al lector, en caso de que desee utilizar este API en aplicaciones con gran trasiego de datos, o sensiblemente crticas, debe valorar las siguientes cuestiones, para comprobar que el uso de este API satisface los requerimientos que deban tener esas aplicaciones.

Caracteres perdidos a la entrada Caracteres perdidos a la salida Frecuencia del flujo de control Tiempo que tarda en despachar un evento Tiempo de procesado de un carcter Tiempo de procesado de un bloque de datos

También podría gustarte