49
Conectando un PIC al Puerto Serie (RS232) Mario Sacco . Vista 63891 veces 35 3 38 Votos 41 Comentarios 41 >> comenta Por muy antiguo que esto pueda parecer, en la actualidad nos encontramos a diario con aplicaciones autónomas que poseen un conector DB9 (o DB25 ) y que se comunican a cualquier ordenador de mesa mediante el protocolo conocido en forma popular como “ comunicación por puerto serie ”. El propósito de este artículo es ayudarte a construir un dispositivo autónomo con salida RS232 y que éste sea capaz de comunicarse con un ordenador de mesa. Esto nos permitirá, en un futuro, utilizar el nuevo circuito integrado de Microchip : el MCP2200 . ¿Para qué se utiliza ese circuito integrado? Muy sencillo: para adaptar una conexión serie a USB. Dicho de otro modo: para reemplazar a todos esos cables RS232 – USB que has comprado y no te han

Conectando Un PIC Al Puerto Serie

Embed Size (px)

Citation preview

Page 1: Conectando Un PIC Al Puerto Serie

Conectando un PIC al Puerto Serie (RS232) Mario Sacco . Vista 63891 veces

35

3

38 Votos 41 Comentarios 41>> comenta

Por muy antiguo que esto pueda parecer, en la actualidad nos encontramos a diario con aplicaciones autónomas que poseen un conector DB9 (o DB25) y que se comunican a cualquier ordenador de mesa mediante el protocolo conocido en forma popular como “comunicación por puerto serie”. El propósito de este artículo es ayudarte a construir un dispositivo autónomo con salida RS232 y que éste sea capaz de comunicarse con un ordenador de mesa. Esto nos permitirá, en un futuro, utilizar el nuevo circuito integrado de Microchip: el MCP2200. ¿Para qué se utiliza ese circuito integrado? Muy sencillo: para adaptar una conexión serie a USB. Dicho de otro modo: para reemplazar a todos esos cables RS232 – USB que has comprado y no te han funcionado. Como decimos siempre, antes de correr debemos aprender a caminar, y éste es el comienzo.

Anuncios Google

Page 2: Conectando Un PIC Al Puerto Serie

o USB Digital I/O - $35 UP

www.usb-industrial.com/ - Analog, Digital,

RS232/422/485 I/O Free Software & Support,

$35 UP

o iButtonlink Products

www.homechip.com - iButton and iButtonLink

products UK and European reseller ¡Sí, por supuesto! ¡Claro que sabemos que el

puerto serie ha quedado obsoleto y ya no se encuentra fácilmente en el panel trasero de cualquier ordenador! Además, luego de haber realizado tantas experiencias mediante la comunicación USB – Ordenador en diferentes artículos publicados en NeoTeo, comenzar a hablar y traer a la mesa de trabajo una conexión mediante puerto serie suena como un retroceso tecnológico, como un viaje al pasado, como un montaje “retro”. La explicación de todo está en el sumario de este artículo. Aún restan muchos años para ver aplicaciones que se comuniquen a un ordenador mediante el puerto serie, el clásico puerto COM donde se conectaba el ratón o el receptor de infrarrojos para comandar el Winamp desde la cama. Exacto, ese conector DB9 macho que en más de una oportunidad nos “mataba” la placa madre del ordenador cuando comenzábamos a experimentar con él. Claro, al dejar de funcionar este puerto ya no podíamos utilizar el ratón y debíamos apelar a alguna

Page 3: Conectando Un PIC Al Puerto Serie

tarjeta PCI que resolviera nuestras desafortunadas actividades “científicas”.

La mayoría de las aplicaciones realizadas con microcontroladores que traspasan la línea del gadget sencillo, del juguete temporal o de la unidad autónoma de trabajo, apuntan habitualmente al manejo de datos útiles que, de un modo u otro, siempre se intenta llevar a un ordenador para su procesamiento. La inmensa mayoría de microcontroladores que hoy existen en el mercado y que tenemos “a mano” para cacharrear y jugar un rato traen una unidad de comunicación serie en su interior. En estos últimos años, esta característica, que permite comunicar de manera muy eficaz a dos microcontroladores entre sí, ha comenzado a presentar un problema “de hardware y conectividad” al avanzar una creciente desaparición (casi en forma definitiva) de los conectores DB9 en los paneles traseros de los ordenadores. Ahora todo es USB. La conexión serie por naturaleza se ha trasladado al Universal Serial Bus y esto se evidencia más cuando pasamos a hablar de ordenadores portátiles. Entonces ¿qué hacemos con aquellas aplicaciones que teníamos que se conectaban al puerto serie de un ordenador? El mercado (chino, claro) nos

Page 4: Conectando Un PIC Al Puerto Serie

trajo una lluvia de soluciones en forma de cables que servirían para resolver el problema de las conexiones: un adaptador DB9 macho a USB, la panacea universal en nuestras manos por unas pocas monedas. ¿Qué más se le podía pedir a la tecnología? ¿Que venga con un LCD de 42” de regalo?

Sin embargo, la realidad fue muy cruel con la mayoría de los incautos compradores de estos cables cuando descubrían que no funcionaban en absoluto, y aquellos cables que lo hacían tenían las funciones muy limitadas y/o erráticas. Cuando apareció en escena el circuito integrado FT232 (de la empresa FTDI) parecía que la luz asomaba en el horizonte y que rápidamente se convertiría en la solución definitiva. De hecho, existen infinitas aplicaciones que lo incorporan como solución de comunicación entre el USART (Universal Synchronous Asynchronous Receiver Transmitter) de un microcontrolador y el bus USB (Arduino es un ejemplo de ello). Sin embargo, su pequeño encapsulado y su compleja configuración ahuyentan a más de un aficionado novel que naufraga en el intento de implementar esta solución. Para muchos es la solución ideal, para otros es un logro muy difícil de alcanzar. No todos los aficionados tienen la misma habilidad manual para construir un dispositivo basado en un encapsulado tan pequeño. Si desarrollar

Page 5: Conectando Un PIC Al Puerto Serie

aplicaciones en encapsulado DIP es toda una hazaña para muchos entusiastas, hablar de manipular un encapsulado LQFP se traslada al mundo de la ciencia ficción.

El FT232 ha sido la solución de muchas plataformas para obtener conectividad USB

Cual si fuese un jugador muy astuto, y luego de observar este convulsionado, mal definido, confuso y complejo escenario, Microchip decidió ocupar un espacio dentro del mundo de los protocolos de comunicaciones con el circuito integrado MCP2200: un conversor USART – USB completo. Además, ha provisto al mercado de herramientas para configurar este componente de acuerdo a las necesidades de cada aplicación.

Page 6: Conectando Un PIC Al Puerto Serie

Pero no avancemos aún hacia él. Si todavía no hemos iniciado nuestro trabajo con un desarrollo por puerto serie, trabajar ahora con el MCP2200 sería tan ilógico como comenzar a ver una película desde la mitad. Veríamos un final glorioso pero no entenderíamos por qué sucedieron todas esas explosiones y quiénes eran esos muchachitos que lograron escapar justo a tiempo (por supuesto, serían los buenos de la historia; siempre ganan los buenos. Si conoces una película donde ganen los malos, avísame).

De lleno al MAX232El MAX232 (Maxim) es un circuito integrado utilizado para adaptar los niveles requeridos en una conexión donde interviene un dispositivo que maneja niveles de tensión TTL (nuestro microcontrolador, por ejemplo) y otro capaz de trabajar bajo los parámetros de la norma EIA/TIA-232E y las V.28/V.24. Expresado en lenguaje de tensiones, los niveles TTL operan entre los 0 y 5Volts y la otra norma, conocida en el mundo técnico como RS-232 (Recommended Standard-232), utiliza tensiones que van desde los -12Volts a los +12Volts. Este circuito integrado (el MAX232) está especialmente diseñado para trabajar en equipos que utilicen bajos niveles de tensión (5Volts) y requiere de muy pocos componentes externos para lograr un funcionamiento óptimo.

Page 7: Conectando Un PIC Al Puerto Serie

Estructura externa e interna del MAX232

En su arquitectura interna, el MAX232 posee los accesorios necesarios para obtener las tensiones que se requieren a ambos lados de los circuitos que enlaza y cuenta con cuatro adaptadores-inversores de tensión: dos son utilizados para la conversión TTL – RS-232 y los otros dos para la operación inversa. En la mayoría de las aplicaciones con microcontroladores se utilizan sólo dos (uno de cada tipo), pero cuando se lo emplea en aplicaciones especiales, como puede ser el caso de redes RS-485, se agrega una conexión extra para controlar la prioridad de uso del bus (RS-485). Es decir, la señal RTS (Request To Send = Petición de envío) que proviene desde el ordenador pasa por una unidad de recepción del MAX 232 y se entrega al controlador de bus RS-485 en niveles de tensión TTL.

Page 8: Conectando Un PIC Al Puerto Serie

Circuito propuesto para una interfaz Microcontrolador / RS-232

En nuestro circuito hemos utilizado todas las unidades que componen el MAX232 y que en alguna ocasión podemos llegar a utilizar. La placa realizada para el montaje coincide en dimensiones y conexión con los zócalos reservados en la entrenadora NeoTeo. Es decir, la placa está realizada con la intención de que pueda ser incrustada en la entrenadora y formar así un bloque único, tal como veremos más adelante en los videos. Vale aclarar que por razones de costos, la construcción de esta placa no ameritaba una construcción sobre un circuito impreso de doble faz. Es por este motivo que debemos alertarte sobre la falta de una vía

Page 9: Conectando Un PIC Al Puerto Serie

en el dibujo ofrecido de ejemplo del circuito impreso. La unión de los ánodos de los diodos LEDs (que se encuentran todos unidos) deberá conectarse con el positivo de la alimentación de esta placa. Este puente se notará al ver el segundo video y, para facilitar tu trabajo, los puntos a unir están indicados en el dibujo inferior con color amarillo. Por supuesto, si deseas puedes construir tu propio diseño de circuito impreso mejorando la ubicación de los componentes según tu conveniencia y gusto.

Circuito impreso utilizado por nosotros

Page 10: Conectando Un PIC Al Puerto Serie

Aspecto final de la placa terminada

Los colores de los LEDs empleados en el montaje coinciden con los que hemos observado en otras placas utilizadas para este propósito, no porque sepamos que existe algún código de colores que indique esta asignación. Entonces, rojo en recepción (Rx) y verde en transmisión (Tx). Para las otras dos conexiones auxiliares seleccionamos el color amarillo para diferenciar su activación respecto a los indicadores de tráfico de datos. Todos estos indicadores visuales nos ayudarán a apreciar el funcionamiento correcto de la placa. Por último, tal como se observa en las imágenes, la utilización de RTS y CTS se realizará mediante puentes externos hasta la entrenadora, en caso de que la aplicación lo requiera en algún momento.

¿Qué vamos a hacer?Empleando una sencilla metáfora podríamos decir que haremos un espejo de datos. La explicación

Page 11: Conectando Un PIC Al Puerto Serie

es muy simple y fácil de comprender: utilizaremos en el ordenador, al que nos conectaremos en su puerto serie, cualquier programa hábil para enviar y recibir datos mediante esta conexión. Podemos utilizar, por ejemplo, el Hyperterminal (usuarios de Windows). En la mayoría de los casos, los programas utilizados para crear, simular, compilar y depurar (debug) los contenidos que luego volcaremos sobre un PIC traen incorporado un “soft adicional” que permite realizar de manera muy sencilla este trabajo de comunicación serie con un terminal remoto conectado a la salida de un puerto COM (a elección) del ordenador. Nosotros, como verás en los videos, utilizamos el que trae Proton (PIC Basic).

La mecánica de funcionamiento del programa cargado en el PIC se sustenta en nueve puntos fundamentales. Por supuesto, estos mismos conceptos pueden aplicarse a otros lenguajes de programación. Nosotros lo evaluamos y te lo mostramos en función del lenguaje Basic. Estos puntos son:

3. Indicar PIC y velocidad de reloj.4. Indicar al sistema que utilizaremos

Bootloader.

Page 12: Conectando Un PIC Al Puerto Serie

5. Inicializar el LCD y declarar las condiciones de uso de la USART.

6. Declarar las variables que usaremos en el programa.

7. Colocar el PIC a la “escucha” (HSERIN).8. Si al completarse 1 segundo no se reciben

datos, se salta a la leyenda de espera de datos.

9. Se reciben datos y se muestran en el LCD (PRINT).

10. Los datos que se reciben se transmiten hacia el ordenador (HSEROUT).

11. Se reinicia el ciclo.

Observa que en tan sólo nueve procedimientos básicos hemos construido, como te mencionamos antes, un espejo de datos: los datos se reciben, se muestran y se devuelven al origen, tal como haría un espejo con cualquier imagen que se refleja en él. Los puntos enumerados están indicados de manera clara en la siguiente imagen:

Page 13: Conectando Un PIC Al Puerto Serie

Programa ejemplo utilizado y las 9 zonas fundamentales del proceso

La velocidad de transmisión y recepción de datos se realiza a 38400 bps. Ten en cuenta de ingresar al panel de control de tu sistema operativo y controlar que esta velocidad coincida con la que está definida en el puerto serie de tu ordenador. Por defecto, siempre está configurada en 9600 bps. y tú deberás cambiarla. De lo contrario, cuando realices el programa para tu microcontrolador, coloca en la declaración HSERIAL BAUD el valor 9600. El resto de los parámetros deberá coincidir con el software que

Page 14: Conectando Un PIC Al Puerto Serie

utilices para enviar los datos a través del puerto serie. En el último video te mostramos que la longitud del texto a enviar es de 16 caracteres y que ocupará sólo el primer renglón del LCD. “Hola Neotenianos” es un texto que ocupa esa cantidad de espacios. El segundo renglón está reservado para el mensaje de espera de datos (punto 6 en el listado del programa). Por último, también vale mencionar la demostración del encendido de los LEDs indicando el tráfico de datos. Esto es de una utilidad enorme a la hora de resolver problemas de conexión. ¿Estará recibiendo los datos? Luego de mostrarlos, ¿los estará enviando o se dispersa hacia otro lugar el programa? Estos son interrogantes que los LEDs te resuelven de manera muy elemental (además de comportarse como un atractivo visual muy “piola”).

ResumiendoUtilizamos la entrenadora NeoTeo para realizar comunicaciones entre el PIC y un ordenador mediante el uso de su puerto serie. La conexión entre ambos se realiza con un circuito integrado MAX232 que ayuda a adaptar niveles de tensión entre el ordenador y el PIC. Cargamos el firmware del PIC mediante el sistema Bootloader (ya empleado en artículos anteriores), y en el

Page 15: Conectando Un PIC Al Puerto Serie

ordenador utilizamos cualquier software de comunicación serial, el que más cómodo nos resulte. Configuramos en el ordenador la misma velocidad de transferencia de datos que en el PIC y comenzamos a experimentar la conectividad por puerto serie. Existen algunos programas dedicados a monitorear de manera profunda la actividad de los puertos del ordenador. Si dispones de alguno de ellos puedes utilizarlo para probar a fondo esta aplicación. Para nuestro propósito, la implementación del MCP2200, podemos considerar que hemos dado el primer paso. Ya estamos caminando. No te pierdas la carrera hacia el USB.

Page 16: Conectando Un PIC Al Puerto Serie
Page 17: Conectando Un PIC Al Puerto Serie
Page 18: Conectando Un PIC Al Puerto Serie
Page 19: Conectando Un PIC Al Puerto Serie
Page 20: Conectando Un PIC Al Puerto Serie

Puerto serial, puerto COM, puerto de comunicaciones y puerto RS-232 ("Recomended Standard-232"),  hacen referencia al mismo puerto. Se le llama serial, porque permite el envío de datos, uno detrás de otro, mientras que un paralelo se dedica a enviar los datos de manera simultánea. La sigla COM es debido al término ("COMmunications"), que traducido significa comunicaciones. Es un conector semitrapezoidal de 9 terminales, que permite la transmisión de datos desde un dispositivo externo (periférico), hacia la computadora; por ello es denominado puerto.

Compitió directamente en el mercado contra el puerto LPT.

Este puerto está siendo reemplazado por el puerto USB para el uso en PDA´s y ratones, pero aún viene integrado en la tarjeta principal (Motherboard) actuales.

 

Figura 1. Puerto serial COM  integrado en la tarjeta principal

("motherboard").

Figura 2. Símbolo del puerto COM.Figura 3. Conector hembra serial del

cable del dispositivo.

  Características del puerto serial COM

En el ámbito de la electrónica comercial se le denomina como conector DB9 ("D-subminiature type B, 9 pin"), esto es D-subminiatura tipo B, con 9 pines.

Se utilizaba principalmente para la conexión del ratón ( Mouse ) , algunos tipos antiguos de  escáneres y actualmente para dispositivos como PDA´s (" Personal Digital Assistant ") ó asistentes personales digitales.

Cada puerto, permite conectar solamente 1 dispositivo. Para conectar y desconectar los dispositivos, así como para que la

computadora los reconozca de manera correcta, es necesario apagar y reiniciar la computadora.

  Terminales eléctricas del puerto serial

      El puerto serial cuenta con 9 contactos tipo pin; se muestran las líneas eléctricas y su descripción básica.

Figura 4. Esquema de las líneas del puerto serial COM.

1.- DCD (Detecta la portadora) 2.- RxD (Recibe datos) 3.- TxD (Transmite datos) 4.- DTR (Terminal de datos listo) 5.- SG (Tierra) 6.- DSR (Equipo de datos listo) 7.- RTS (Solicita enviar) 8.- CTS (Disponible para enviar)

Page 21: Conectando Un PIC Al Puerto Serie

9.- RI (Indica llamada)

Page 22: Conectando Un PIC Al Puerto Serie
Page 23: Conectando Un PIC Al Puerto Serie
Page 24: Conectando Un PIC Al Puerto Serie

Puerto serie De Wikipedia, la enciclopedia libre

Saltar a: navegación, búsqueda

Puerto en serie

Conector macho Mini DIN-8 que se usa para conectar por el puerto serie a las computadoras Macintosh.

Un puerto serie o puerto serial es una interfaz de comunicaciones de datos digitales, frecuentemente utilizado por computadoras y periféricos, donde la información es transmitida bit a bit enviando un solo bit a la vez, en contraste con el puerto paralelo que envía varios bits simultáneamente.[1] La comparación entre la transmisión en serie y en paralelo se puede explicar usando una analogía con las carreteras. Una carretera tradicional de un sólo carril por sentido sería como la transmisión en serie y una autovía con varios carriles por sentido sería la transmisión en paralelo, siendo los vehículos los bits que circulan por el cable.

Page 25: Conectando Un PIC Al Puerto Serie

Contenido [ocultar]

1 Introducción 2 Puerto serie asincrónico 3 Puertos serie modernos 4 Tipos de comunicación en serie 5 Véase también 6 Referencias

[editar] Introducción

En informática, un puerto serie es una interfaz física de comunicación en serie a través de la cual se transfiere información mandando o recibiendo un bit. A lo largo de la mayor parte de la historia de los ordenadores, la transferencia de datos a través de los puertos de serie ha sido generalizada. Se ha usado y sigue usándose para conectar las computadoras a dispositivos como terminales o módems. Los ratones, teclados, y otros periféricos también se conectaban de esta forma.

Mientras que otras interfaces como Ethernet, FireWire, y USB mandaban datos como un flujo en serie, el término "puerto serie" normalmente identifica el hardware más o menos conforme al estándar RS-232, diseñado para interactuar con un módem o con un dispositivo de comunicación similar.

Actualmente en la mayoría de los periféricos serie, la interfaz USB ha reemplazado al puerto serie por ser más rápida. La mayor parte de los ordenadores están conectados a dispositivos externos a través de USB y, a menudo, ni siquiera llegan a tener un puerto serie.

El puerto serie se elimina para reducir los costes y se considera que es un puerto heredado y obsoleto. Sin embargo, los puertos serie todavía se encuentran en sistemas de automatización industrial y algunos productos industriales y de consumo.

Los dispositivos de redes, como los enrutadores y switches, a menudo tienen puertos serie para modificar su configuración. Los puertos serie se usan frecuentemente en estas áreas porque son sencillos, baratos y permiten la interoperabilidad entre dispositivos. La desventaja es que la configuración de las conexiones serie requiere, en la mayoría de los casos, un conocimiento avanzado por parte del usuario y el uso de comandos complejos si la implementación no es adecuada.

[editar] Puerto serie asincrónico

A través de este tipo de puerto la comunicación se establece usando un protocolo de transmisión asíncrono. En este caso, se envía en primer lugar una señal inicial anterior al

Page 26: Conectando Un PIC Al Puerto Serie

primer bit de cada byte, carácter o palabra codificada. Una vez enviado el código correspondiente, se envía inmediatamente una señal de stop después de cada palabra codificada.

La señal de inicio (start) sirve para preparar al mecanismo de recepción o receptor, la llegada y registro de un símbolo, mientras que la señal de stop sirve para predisponer al mecanismo de recepción para que tome un descanso y se prepare para la recepción del nuevo símbolo.

La típica transmisión start-stop es la que se usa en la transmisión de códigos ASCII a través del puerto RS-232, como la que se establece en las operaciones con teletipos.

El puerto serie RS-232 (también conocido como COM) es del tipo asincrónico, utiliza cableado simple desde 3 hilos hasta 25 y conecta computadoras o microcontroladores a todo tipo de periféricos, desde terminales a impresoras y módems pasando por mouses.

La interfaz entre el RS-232 y el microprocesador generalmente se realiza mediante el chip UART 8250 (computadoras de 8 y 16 bits, PC XT) o el 16550 (IBM Personal Computer/AT y posteriores).

El RS-232 original tenía un conector tipo DB-25, sin embargo la mayoría de dichos pines no se utilizaban, por lo que IBM estandarizó con su gama IBM Personal System/2 el uso del conector DB-9 (ya introducido en el AT) que se usaba, de manera mayoritaria en computadoras. Sin embargo, a excepción del mouse, el resto de periféricos solían presentar el DB-25

La norma RS-422, similar al RS-232, es un estándar utilizado en el ámbito industrial.

[editar] Puertos serie modernos

Uno de los defectos de los puertos serie iniciales era su lentitud en comparación con los puertos paralelos -hablamos de 19.2 kbits por segundo- sin embargo, con el paso del tiempo, están apareciendo multitud de puertos serie de alta velocidad que los hacen muy interesantes ya que presentan las ventajas del menor cableado y solucionan el problema de la merma de velocidad usando un mayor apantallamiento, y más barato, usando la técnica del par trenzado. Por ello, el puerto RS-232, e incluso multitud de puertos paralelos, se están sustituyendo reemplazándose por los nuevos puertos serie como el USB, el FireWire o el Serial ATA.

[editar] Tipos de comunicación en serieSimplex

Page 27: Conectando Un PIC Al Puerto Serie

En este caso el emisor y el receptor están perfectamente definidos y la comunicación es unidireccional. Este tipo de comunicaciones se emplean, usualmente, en redes de radiodifusión, donde los receptores no necesitan enviar ningún tipo de dato al transmisor.

Duplex, half duplex o semi-duplex

En este caso ambos extremos del sistema de comunicación cumplen funciones de transmisor y receptor y los datos se desplazan en ambos sentidos pero no de manera simultánea. Este tipo de comunicación se utiliza habitualmente en la interacción entre terminales y una computadora central.

Full Duplex

El sistema es similar al duplex, pero los datos se desplazan en ambos sentidos simultáneamente. Para que sea posible ambos emisores poseen diferentes frecuencias de transmisión o dos caminos de comunicación separados, mientras que la comunicación semi-duplex necesita normalmente uno solo. Para el intercambio de datos entre computadores este tipo de comunicaciones son más eficientes que las transmisiones semi-dúplex.letty

[editar] Véase también

   Variante física del puerto serial

     Se pueden encontrar algunos dispositivos externos e incluso computadoras que tienen un puerto serial diferente al común de 9 pines. Este puerto serial consta de 25 pines, es tipo macho y se utiliza con frecuencia acompañado de un adaptador para poder ser utilizado con conectores de 9 pines.

Figura 5. Conector serial de 25 pines tipo hembra del dispositivo.

Figura 6. Adaptador para el puerto serial de 25 pines a 9 pines.

   Velocidad de transmisión del puerto serial COM

    La forma de medir la velocidad de transmisión del puerto serial es en KiloBytes/segundo (KB/s):

Puerto Velocidad en (KiloBytes/segundo)

Page 28: Conectando Un PIC Al Puerto Serie

Serial COM 112 KB/s

Tabla 1. Velocidad de transmisión del puerto COM en KB.

Page 29: Conectando Un PIC Al Puerto Serie
Page 30: Conectando Un PIC Al Puerto Serie

The Serial low level programming MINI-HOWTO

Sergio Costas Rodriguez

http://www.rastersoft.com

v1.0, 15 April 2000

Esta es una pequeña guia en la que pretendo explicar como programar a muy bajo nivel el puerto serie. En concreto, pretendo explicar como leer y escribir en los bits de control del puerto serie (DCD, DTR, DSR, RTS, CTS y RI) mediante llamadas IOCTL.

Indice

1. Introduccion.2. Perifericos3.

1. El modelo de Entrada/Salida en UNIX/Linux2. La funcion IOCTL

4. El puerto serie.5.

1. Cambiando los permisos de acceso2. ¿De que entradas y salidas dispongo?3. Funciones IOCTL disponibles para el puerto serie

6. Referencias

1. Introduccion

Mucha gente necesita poder acceder a bajo nivel al puerto serie, para asi poder realizar diversas funciones basicas. Por ejemplo, si se quiere programar un emulador de terminal para el MODEM, además de enviar y recibir bytes resulta necesario poder ajustar la velocidad del puerto y tener acceso a las señales de control, como RING, DCD, etc. Por desgracia, una tarea tan trivial puede convertirse en un autentico calvario, no por su dificultad, sino por la falta de documentacion.

Si bien la libreria TERMIOS proporciona una gran cantidad de funciones que simplifican notablemente la programacion, no es capaz (o al menos yo no lo he conseguido) de proporcionar acceso a bajo nivel a las señales de control del puerto serie, en concreto DCD, DTR, DSR, RTS, CTS y RI. El acceso a estas resulta muy importante, si no crucial, cuando

Page 31: Conectando Un PIC Al Puerto Serie

se pretende realizar diversas aplicaciones tales como programas de terminal, programadores de microcontroladores (por ejemplo para el PIC), y otros cientos de ideas.

La primera solucion que se le ocurre al programador suele ser el acceso directo a los puertos de Entrada/Salida. Esto tiene dos inconvenientes: la necesidad de que el codigo corra con privilegios de superusuario, y el hecho de necesitar conocer con precision como esta implementado el dispositivo fisico. Este ultimo problema surge tambien si se decide hacer un driver especifico para la tarea, ademas de que los potenciales usuarios del programa necesitarian instalarlo tambien.

Sin embargo, resulta perfectamente posible acceder a dichas señales en modo usuario sin peligro para la seguridad y estabilidad del sistema. La forma de hacerlo es precisamente lo que voy a intentar explicar aqui.

Para el resto de las funciones (como cambiar la velocidad de transmision del puerto, por ejemplo) resulta mucho mas comodo usar las funciones TERMIOS.

2. Perifericos

2.1. El modelo de Entrada/Salida de UNIX/Linux

UNIX supuso una revolucion por muchas razones. Sin embargo, una de las mas importantes fue, sin duda, su modelo de Entrada/Salida. En UNIX, los perifericos se encuentran representados como simples ficheros del sistema de archivos. De esta forma, si se quiere enviar datos a, por ejemplo, la pantalla, basta con abrir el fichero asociado a ella y escribir con las funciones de siempre. El resultado aparecera en el monitor. Lo mismo ocurre con los puertos serie, paralelo, etc.

El hecho de que se acceda a todos los perifericos de igual forma simplifica notablemente la programacion en un sentido, pues el programador no necesita aprender cientos de funciones especificas para cada dispositivo, y a fin de cuentas, en el 99% de los casos no se pretende hacer filigranas con los perifericos, sino simplemente enviar algo y nada mas. Sin embargo ¿que ocurre cuando sí hace falta enviar opciones especificas a un dispositivo? ¿Que hago para indicar, por ejemplo, la velocidad de transmisión de un puerto serie, o las coordenadas de impresion si se trata de un adaptador de video?

2.2. La funcion IOCTL

Todo driver soporta una serie de funciones basicas. En concreto ha de soportar: apertura, lectura, escritura y cierre. Estas funciones (junto a

Page 32: Conectando Un PIC Al Puerto Serie

alguna que otra mas) son las que permiten acceder a los dispositivos como si de ficheros se tratara. Sin embargo, existe una quinta funcion que nos permite enviar comandos especificos para cada periferico. Es la funcion IOCTL (Input/Output ConTroL).

Esta funcion recibe tres parametros y devuelve uno:

      #include <sys/ioctl.h>

      int ioctl(int d, int request, void *arg);

El primer parametro (d) es un identificador de dispositivo. Puesto que se trata de una variable de tipo int y no de tipo FILE, el fichero del dispositivo ha de abrirse usando la funcion open() en lugar de fopen(). Por la misma razon, para leer o escribir en el ha de usarse read() y write() en vez de fread() o fwrite(), y para cerrarlo se usara close() en vez de fclose(). Como siempre, una mirada a las paginas del manual resolveran cualquier duda sobre estas cuatro funciones.

El segundo parametro (request) especifica el comando que se ha de enviar al dispositivo. Estos comandos dependen del periferico con el que se este tratando. Asi pues, el comando 1 hara cosas distintas si lo enviamos a un puerto serie o a uno paralelo.

El tercer parametro (arg) es siempre un puntero al/los parametros que se le han de pasar al driver, o bien en donde ha de retornar este los resultados. Como tipo de puntero he puesto void simplemente porque dependiendo del comando que se envie habra que poner un puntero a int, a char, o incluso a una estructura.

Por ultimo, ioctl() nos devuelve un valor que sera cero si la funcion se ha ejecutado con exito, o -1 si ha habido algun problema. En este caso, el tipo de error lo podremos ver en la variable global errno (para ello no hay que olvidarse de hacer un #include <errno.h> al principio del codigo).

3. El puerto serie

Los puertos serie tienen asociados una serie de ficheros en el directorio /dev. En versiones antiguas de Linux estos eran los ficheros

      /dev/cua

seguidos de un numero que especificaba que puerto era cada uno. Asi pues, /dev/cua0 seria el COM1 de MS-DOS.

Page 33: Conectando Un PIC Al Puerto Serie

En las versiones mas recientes del nucleo (versiones 2.x) los puertos serie tienen asociados los ficheros

      /dev/ttyS

seguidos tambien de un numero. Asi pues, /dev/ttyS0 es el COM1 de MS-DOS. Por razones de compatibilidad con viejos programas, se siguen soportando los viejos ficheros cua, pero no se recomienda su uso en programas nuevos.

3.1. Cambiando los permisos de acceso

Para poder acceder a un periferico es preciso que su fichero asociado tenga permisos de acceso adecuados, igual que ocurre con el resto de los ficheros normales del disco duro. Puesto que el dueño de los ficheros de dispositivo es el usuario root, es necesario hacer el cambio entrando como el. Asi, para permitir que cualquiera pueda leer y escribir en cualquier puerto serie, se debe hacer (siempre como root):

      chmod 666 /dev/ttyS*

Si se quiere permitir que cualquiera acceda al segundo puerto serie, se hara:

      chmod 666 /dev/ttyS1

3.2. ¿De que entradas y salidas dispongo?

Un puerto serie dispone de los siguientes pines, cuyo numero en el conector es el siguiente:

Nombre Sentido Conector 25 pines Conector 9 pines

TXD salida 2 3

RXD entrada 3 2

RTS salida 4 7

CTS entrada 5 8

DTR salida 20 4

DSR entrada 6 6

Page 34: Conectando Un PIC Al Puerto Serie

DCD entrada 8 1

RI entrada 22 9

GND masa 7 5

TXD y RXD son respectivamente la salida y la entrada de datos serie. Estos datos se envian en el siguiente formato:

      Por defecto, TXD se encuentra a -12 voltios (nivel alto).

      Cuando se quiere enviar un byte, la linea se pone a 12 voltios (nivel bajo) durante el tiempo de un bit. Es el bit de inicio, que marca el comienzo de una transmision.

      A continuacion se envian los bits del dato, empezando por el menos significativo. El cero (nivel bajo) se representa con 12 voltios, y el uno (nivel alto) se representa con -12 voltios.

      Por ultimo se envian uno o dos bits de parada a -12 voltios (nivel alto) antes de iniciar la transmision del siguiente.

Vemos que los niveles de tension se encuentran invertidos con respecto a lo que cabria esperar (el 0 son 12 voltios y el 1 son -12 voltios). Esto solo ocurre en estas dos lineas. En el resto, el cero son -12 voltios y el uno son 12.

Todas las lineas estan limitadas en corriente a unos 200mA. Esto protege al puerto en caso de que ocurra cualquier cortocircuito. Esta caracteristica tambien es aprovechada por muchos circuitos simples que se conectan al puerto serie, de modo que se consigue una notable economia de componentes.

Debido a que las lineas TXD y RXD son controladas por el propio puerto serie y no por el procesador, en principio no resulta posible indicar directamente un valor de tension en TXD o leer el que se encuentre en RXD. Todo lo que podemos hacer es enviar un byte al puerto para que este lo envie por si mismo en el formato indicado. Sin embargo, en la practica, las UARTs disponen de un bit que, al activarlo, fuerzan un cero (+12 voltios) en dicho pin.

3.3. Funciones IOCTL disponibles para el puerto serie

Seis son las funciones ioctl que nos interesan para el control de las lineas del puerto serie: TIOCMGET, TIOCMBIS, TIOCMBIC, TIOCMSET,

Page 35: Conectando Un PIC Al Puerto Serie

TIOCSBRK y TIOCCBRK. Para disponer de estas definiciones es necesario hacer:

      #include <asm/ioctls.h>

La funcion TIOCMGET precisa que se le pase un puntero a int como argumento de la funcion ioctl(). Asi pues, hariamos:

      retorno=ioctl(fichero,TIOCMGET,&argumento);

En 'argumento' nos almacenara un patron de bits indicando el estado de las distintas entradas y salidas del puerto serie.

La funcion TICMBIS tambien precisa de un puntero a int como argumento de la funcion ioctl(). Asi pues:

      retorno=ioctlfichero,TIOCMBIS,&argumento);

activara aquellas salidas que le indiquemos, dejando inalteradas el resto. Por su parte, la funcion TICMBIC hace lo contrario: desactiva (pone a cero) las salidas que le indiquemos, sin modificar el resto. La usariamos asi:

      retorno=ioctlfichero,TIOCMBIC,&argumento);

La funcion TIOCMSET activa las salidas que le indiquemos y desactiva el resto. Precisa tambien un puntero a int como argumento de la funcion ioctl(). Asi pues:

      retorno=ioctl(fichero,TIOCMSET,&argumento);

activara las salidas que le indiquemos en funcion del patron de bits que contenga 'argumento'.

El bit que corresponde a cada entrada y salida viene definido tambien en el fichero ioctl-types.h. Este fichero se incluye automaticamente con ioctl.h.

En concreto, estan las definiciones:

TIOCM_DTR DTR 0x002

TIOCM_RTS RTS 0x004

TIOCM_CTS CTS 0x020

Page 36: Conectando Un PIC Al Puerto Serie

TIOCM_CAR DCD 0x040

TIOCM_CD DCD 0x040

TIOCM_RNG RI 0x080

TIOCM_RI RI 0x080

TIOCM_DSR DSR 0x100

Por ultimo, las funciones TIOCSBRK y TIOCCBRK permiten poner a cero (+12 volts) o devolver al estado normal, respectivamente, el pin TXD. Como dicho estado de reposo es un uno, estas funciones nos permiten controlar a voluntad dicha salida.

      retorno=ioctl(fichero,TIOCSBRK,&argumento);

      retorno=ioctl(fichero,TIOCCBRK,&argumento);

El puntero &argumento no es modificado, por lo que se puede dar cualquiera.

Por supuesto, existen otras muchas funciones IOCTL para el puerto serie (man ioctl-list), pero todo lo que se puede hacer con ellas tambien resulta factible hacerlo con la libreria TERMIOS.

4. Referencias

Serial-HOWTO y Serial-Programming-HOWTO: explican como trabaja el puerto serie y como usar las TERMIOS.

Coffee: mini-HOWTO en el que se explican las bases para acceso directo a puertos de Entrada/Salida.

IO-Port-Programming: HOWTO donde se explica de forma muy detallada la forma de acceder a puertos de Entrada/Salida.

Page 37: Conectando Un PIC Al Puerto Serie
Page 38: Conectando Un PIC Al Puerto Serie
Page 39: Conectando Un PIC Al Puerto Serie
Page 40: Conectando Un PIC Al Puerto Serie

 

El siguiente código está escrito para esta situación: 

Un dispositivo (para el caso en que se usó este programa fue un pic) está conectado a través de un circuito a tres sensores: voltaje, corriente y frecuencia. Mediante un conversor A/D envía al puerto serial de la PC (a 9600 bauds) los datos en código Ascii como siguen:

1. El dispositivo envía primero una "A" (cod. Ascii 65) así el programa en Matlab sabe que llegarán los dotos de una muestra de corriente que se guardará en el vector A.

2. Para la muestra de corriente siempre llegarán cuatro caracteres, por ejemplo, para 0.134 amperios, el dispositivo enviará al puerto serial los códigos Ascii de los caracteres "0", ".", "1", "3" y "4". 

3. El dispositivo envía a continuación una "B" (cod. Ascii 66) así el programa en Matlab sabe que llegarán los dotos de una muestra de voltaje que se guardará en el vector V.

4. Para la muestra de voltaje siempre llegarán cuatro caracteres, por ejemplo, para 5.250 voltios, el dispositivo enviará al puerto serial los códigos Ascii de los caracteres "5", ".", "2", "5" y "0". 

3. El dispositivo envía a continuación una "F" (cod. Ascii 70) así el programa en Matlab sabe que llegarán los dotos de una muestra de frecuencia que se guardará en el vector F.

4. Para la muestra de frecuencia no se sabe cuántos caracteres llegarán. Si se miden 50 Hz llegarán dos caracteres: "5" y "0". Si se miden 1550 Hz llegarán cuatro caracteres: "1", "5", "5" y "0". Nadie sabe cuantos caracteres llegarán, sólo se sabe que éstos se terminan cuando se recibe nuevamente una "A" y todo el ciclo (desde el paso 1) se vuelve a repetir. 

El programa almacenará cien muestras por cada parámetro leído (voltaje, corriente y frecuencia), las almacenará en sus respectivos vectores y mostrará estos en una gráfica en pantalla. Todo esto se repetirá ochenta veces. Entonces el programa cierra el puerto y finaliza.

El código completo del programa es el siguiente:

% programado por Yelinna Pulliticlear all;close all;clc;

PS=serial('COM1');set(PS,'Baudrate',9600); % se configura la velocidad a 9600 Baudiosset(PS,'StopBits',1); % se configura bit de parada a uno

Page 41: Conectando Un PIC Al Puerto Serie

set(PS,'DataBits',8); % se configura que el dato es de 8 bits, debe estar entre 5 y 8set(PS,'Parity','none'); % se configura sin paridadset(PS,'Terminator','CR/LF');% “c” caracter con que finaliza el envío set(PS,'OutputBufferSize',1); % ”n” es el número de bytes a enviarset(PS,'InputBufferSize' ,1); % ”n” es el número de bytes a recibirset(PS,'Timeout',5); % 5 segundos de tiempo de espera

fopen(PS);

A=[]; %corrienteV=[]; %voltajeF=[]; %frecuencia

A1=[]; %temp corrienteV1=[]; %temp voltajeF1=[]; %temp frecuenciaCh=0;

disp('presione enter para iniciar captura (solo se puede parar la ejecucion mediante control-C)');pause;

inn=1;frec=0;

while inn<80

for j=1:100

if frec==65 Ch=frec;else Ch=fread(PS,1,'uchar'); % Ch: variable donde se almacena el dato leido del puertoend;switch Ch case 65 for k=1:4 A1 = [A1 fread(PS,1,'uchar')]; end;frec=0; case 66 for k=1:4

Page 42: Conectando Un PIC Al Puerto Serie

V1 = [V1 fread(PS,1,'uchar')]; end;frec=0; case 70 F1 = [F1 fread(PS,1,'uchar')]; while frec ~=65 frec= fread(PS,1,'uchar'); if frec ~=65 F1 = [F1 frec]; end; end; otherwise continue;end;

A1=char(A1); V1=char(V1); F1=char(F1); % conv ascii a caractA=[A str2num(A1)]; % convierte de caract a numeroV=[V str2num(V1)]; F=[F str2num(F1)];

A1=[]; V1=[]; F1=[]; end;

A=A*200/5; V=V*24/5;

figure(1)colordef(1,'black');subplot(4,1,1)plot(A,'r');xlabel('tiempo')ylabel('Amperios');% axis([0 length(A) 0 225]);subplot(4,1,2)plot(F,'m');xlabel('tiempo')ylabel('Hz');% axis([0 length(F) 0 10000]);subplot(4,1,3)plot(V,'b');

Page 43: Conectando Un PIC Al Puerto Serie

xlabel('tiempo')ylabel('Voltios');% axis([0 length(V) 0 30]);subplot(4,1,4)% plot(F,'m');plot(F,A)xlabel('Frecuencia')ylabel('Corriente')% xlabel('tiempo')% ylabel('Hz');axis([0 length(F) 0 length(A)]);% axis([0 length(F) 0 10000]);

pause(0.1);

A=[]; %corrienteV=[]; %voltajeF=[]; %frecuencia

inn=inn+1;end;

fclose(PS);delete(PS);clear PS;INSTRFIND

La línea donde se hace:

Es simplemente para establecer los datos en los vectores dentro de un rango definido.

Para saber un poco más de cómo manejar el puerto serial desde Matlab recomiendo leer este tutorial.