REDES DE DATOS
RS-232


Comienzo de pagina
COMUNICACION SERIAL


La principal ventaja de la comunicación serial es el uso de menos líneas cuando lo comparamos con la comunicación paralela. Efectivamente un enlace serial puede ser realizado con apenas tres líneas, una para transmisión, una para recepción y una tercera común a las dos anteriores o retorno. El control de flujo puede hacerse por software utilizando protocolos como el XON – XOFF o por hardware utilizando algunas líneas adicionales de control. Tambien la transmisión puede ser Half Duplex o Full Duplex y la velocidad de transmisión variable pero estandarizada.

En la transmisión serial, como su nombre lo indica, los bits de un carácter ASCII son transmitidos sobre una línea y estan separados en el tiempo. La fig. 1 muestra el formato de la transmisión serial asincronica estándar.

En ella podemos distinguir un bit de comienzo, 8 bits correspondientes al carácter y un bit de parada. Los bits correspondientes al carácter son transmitidos comenzando con los LSB.


Interfaz RS-232

Los niveles de voltaje que se usan en el estándar RS-232, el equivalente en niveles lógicos(TTL) y la terminología correspondiente, se muestran en la siguiente Tabla.

Voltaje
Lógico
Control
Terminología
+3[v] a +25[v]
0
Activo
Espacio
-3[v] a - 25[v]
1
Inactivo
Marca

De la Tabla se observa que un "1" lógico, equivale a un voltaje negativo (-3v a -25 v), y un "0" lógico, equivale a un voltaje positivo (+3v a +25v). Un voltaje que está entre +3v y -3v se considera como indeterminado.

Cuando la línea se mantiene en "1" (Marca), está en estado de reposo. Cuando la línea está en "0" (Espacio) se toma como activa.

La velocidad a la que se envían datos en forma serial a través de una línea de comunicación, se denomina velocidad en baudios. La velocidad de baudios es expresada en unidades de bits por segundo. Una conexión RS-232 con velocidad de 1200 baudios tiene la capacidad de enviar 1200 bits de datos en 1 segundo. Si se pueden enviar 1200 bits en un segundo, como máximo, el inverso de 1200 dará como resultado el tiempo de bit (período de un bit).

Si un receptor y un transmisor se conectan a 1200 baudios, el transmisor enviará bits de datos cada 833us, y el receptor tomará lectura de los bits de datos cada 833us.

Protocolo de Comunicación Serial asincrónico estándar

El protocolo define una serie de reglas a fin de estandarizar la técnica de comunicación. En este caso se establece un bit de comienzo activo 0 y un bit de parada lógico activo 1. Tambien se contempla velocidades de transmisión hechas estándar: 75, 110, 150, 300, 600, 1200, 2400, 4800, 9600 y 19200 bit/seg.

Diferentes parámetros deben ser especificados cuando configuramos un puerto serial, Los más comunes son:

1. Bits por carácter, usualmente de 5 a 8 bits por carácter
2. Número de stop bits, normalmente 1 o 2
3. Bit de paridad, usado para detectar un error en un único bit, puede ser especificado como par o impar o sin pararidad
4. Velocidad de transmisión

Control de Flujo

El control de flujo se hace necesario cuando la velocidad de transferencia del DTE es varias veces mayor que la velocidad a la que el DCE procesa los datos. En este caso el buffer del DCE se llenará y en consecuencia habrá pérdidas de datos.

El control de flujo puede hacerse por hardware y por software. El control de flujo por software, a veces denominado Xon/Xoff usa dos caracteres ASCII. Xon, normalmente indicado por el caracter ASCII 17 (DC1), y Xoff por el carácter ASCII 19 (DC3).

El DCE que normalmente tiene un buffer de memoria pequeño, envia el carácter Xoff, cuando este se llena, indicandole al DTE que pare de enviar datos. Una vez que el DCE tiene espacio para aljojar más datos, envia el carácter Xon para indicarle al DTE que envie información. Este control de flujo tiene la ventaja de no necesitar líneas adicionales ya que los caracteres Xon y Xoff son enviados a través de las líneas TD/RD. Como desventaja tiene la disminución de la velocidad de transferencias debido al envio de los caracteres Xon y Xoff, que no forman parte del mensaje.

El control de flujo por hardware, también conocido como RTS/CTS, usa dos líneas del cable serial: RTS y CTS. Cuando el DTE desea enviar datos , este activa la línea RTS. Si el DCE tiene espacio para los datos, lo indica activando la línea CTS y así el DTE inicia la transferencia de información . Si el DCE se queda sin espacio para alojar más datos, entonces desactiva la línea CTS, indicandole al DTE que no envíe más información.

El programa Hyperterminal de Windows tiene control de flujo por Hardware, por software Xon/Xoff y None, este último cuando no se va a usar ningún control de flujo.

Construcción de un cable serie

El cable que vamos a confeccionar es de tres hilos para conectar de forma simple dos DTEs. Se utilizarán conectores hembra DB-9 y cable. La nomenclatura y función de cada pin en el conector DB9 es la siguiente, de los cuales vamos a utilizar el pin 2, 3 y 5:


Programación de la conexión serie

Se utilizará el cable realizado en el apartado anterior para conectar dos PC’s por el puerto serie. A continuación se probará un programa en C que controle los registros del puerto serie RS-232. Este programa permite que cuando en un computador se apriete una tecla, el carácter correspondiente aparezca en la pantalla del otro computador. Para ello el programa muestrea contínuamente los registros apropiados del puerto y realiza una transmision full-duplex.

Se utilizará para la explicación de este programa la información sobre el hardware de comunicaciones de datos de la UART 8250. Además, se utilizará un compilador básico de C para crear el programa, compilarlo y ejecutarlo.

El programa inicial es el siguiente:

main( )
{ unsigned char x,y; /* Inicialización de variables */
x=inport(0x3FB);
x=x|0x080;
outport(0x3FB,x); /* DLAB=1 respetando el resto del contenido*/
outport(0x3F9,1); /* Pongo el Divisor Latch (D=288) para */
outport(0x3F8,32); /* 400 bps a frec=1,8432 MHz */
outport(0x3FB,2); /* DLAB=0 y 7 bits de longitud, 1 bit de stop */

do
{
if(kbhit()!=0) /* Si se aprieta una tecla */
{
y=getch(); /* leemos un carácter */
x=inport(0x3FD); /* Esperamos Buff.Transm.Vacío */
while(!(x&0x30)) x=inport(0x3FD); /* Bit 5 de 3FDh=1 */
outport(0x3F8,y); /* y mandamos caracter leido */
};

if((x=inport(0x3FD)) & 0x01) /* Si datos en buffer de recepcion */
{
x=inport(0x3F8); /* Leemos el dato */
putch(x); /* y lo ponemos en pantalla */
};
} while(1); /* el bucle se repite indefinidamente */
}


Comienzo de pagina

Web realizado por: jorgehoracio-ubaldo
Copyright © 2004
Última actualización: Agosto de 2004