comunicación de dos ordenadores mediante el...

130
1 Comunicación de dos ordenadores mediante el protocolo X-MODEM AUTOR: Luis Enciso Morales. DIRECTOR: Esteban del Castillo. FECHA: Noviembre / 2.003

Upload: ngothu

Post on 19-Sep-2018

221 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Comunicación de dos ordenadores mediante el …deeea.urv.cat/public/PROPOSTES/pub/pdf/517pub.pdf · sistema de comunicaciones es captar señales digitales y modularlas para la emisión

1

Comunicación de dos ordenadores mediante elprotocolo X-MODEM

AUTOR: Luis Enciso Morales.DIRECTOR: Esteban del Castillo.

FECHA: Noviembre / 2.003

Page 2: Comunicación de dos ordenadores mediante el …deeea.urv.cat/public/PROPOSTES/pub/pdf/517pub.pdf · sistema de comunicaciones es captar señales digitales y modularlas para la emisión

Agradecimientos

Especialmente a mi familia por suconsideración, paciencia y respeto, incluso enlas etapas más duras de mi vida.

A Esteban del Castillo, director de esteproyecto, por ofrecerse siempre abierto adiversas consultas durante la ejecución deéste.

A todo el personal docente que día trasdía ofrece sus conocimientos y su tiempodesinteresadamente para suministrar unabuena formación a los futuros ingenieros.

Page 3: Comunicación de dos ordenadores mediante el …deeea.urv.cat/public/PROPOSTES/pub/pdf/517pub.pdf · sistema de comunicaciones es captar señales digitales y modularlas para la emisión

INDICE Comunicación de dos ordenadores con protocolo x-módem

i

ÍNDICE

1. OBJETIVOS pág. 4

2. DESCRIPCIÓN DEL SISTEMA pág. 5

2.1. INTRODUCCION pág. 5

2.2. SISTEMA DE COMUNICACIONES pág. 5

2.3. DESCRIPCIÓN DEL DCE: El módem pág. 7

2.4. DESCRIPCIÓN DEL DTE pág. 10

2.5. DESCRIPCIÓN DE LA RED TELEFÓNICA CONMUTADA (RTC) pág. 12

2.6. PROTOCOLOS DE ENLACE DE DATOS pág. 13

2.6.1. Introducción pág. 13

2.6.2. El protocolo X-MODEM pág. 14

2.6.3. Funcionamiento del protocolo X-MODEM pág. 16

3. PRESENTACIÓN DEL PROBLEMA Y POSIBLES SOLUCIONES pág. 19

4. DESCRIPCIÓN DE LA SOLUCIÓN ADOPTADA pág. 22

4.1. SECUENCIA DE PROCESOS pág. 22

4.1.1. INICIALIZACIÓN DEL SISTEMA pág. 22

4.1.2. ESTABLECIMIENTO DE CONEXIÓN ENTRE MÓDEMS pág. 28

4.1.3. TRANSMISIÓN / RECEPCIÓN DE DATOS pág. 31

4.1.3.1. Transmisión de datos pág. 31

4.1.3.2. Recepción de datos pág. 35

4.1.4. CIERRE DE CONEXIÓN pág. 38

4.1.5. RETORNAR LA ANTIGUA CONFIGURACIÓN pág. 38

4.2. DESCRIPCIÓN DEL ALGORITMO DEL PROGRAMA pág. 39

4.2.1. EL ENTORNO DEL PROGRAMA pág. 39

4.2.2. PROGRAMA PRINCIPAL pág. 40

4.2.3. ENTORNO DE CONFIGURACIÓN pág. 41

4.2.4. TRANSMISIÓN DE DATOS pág. 43

4.2.5. RECEPCIÓN DE DATOS pág. 45

Page 4: Comunicación de dos ordenadores mediante el …deeea.urv.cat/public/PROPOSTES/pub/pdf/517pub.pdf · sistema de comunicaciones es captar señales digitales y modularlas para la emisión

INDICE Comunicación de dos ordenadores con protocolo x-módem

ii

5. MANUAL DE USUARIO pág. 48

5.1. EJECUCIÓN DEL PROGRAMA pág. 50

5.2. ENTORNO DE CONFIGURACIÓN pág. 51

5.3. MARCACIÓN DE UNA LLAMADA pág. 53

5.4. RESPUESTA DE UNA LLAMADA pág. 55

5.5. EMISIÓN DE UN FICHERO pág. 56

5.6. RECEPCIÓN DE UN FICHERO pág. 57

5.7. SALIR DEL PROGRAMA pág. 58

6. REFERENCIAS pág. 59

7. ANEXOS pág. 60

• ANEXO 1: ALGORITMO pág. 61

• ANEXO 2: LA UART pág. 111

• ANEXO 3: LA RS-232 pág. 123

Page 5: Comunicación de dos ordenadores mediante el …deeea.urv.cat/public/PROPOSTES/pub/pdf/517pub.pdf · sistema de comunicaciones es captar señales digitales y modularlas para la emisión

2. DESCRIPCIÓN DEL SISTEMA Comunicación de dos ordenadores con protocolo x-módem

3

Page 6: Comunicación de dos ordenadores mediante el …deeea.urv.cat/public/PROPOSTES/pub/pdf/517pub.pdf · sistema de comunicaciones es captar señales digitales y modularlas para la emisión

2. DESCRIPCIÓN DEL SISTEMA Comunicación de dos ordenadores con protocolo x-módem

4

1 OBJETIVOS

El presente proyecto pretende asumir los siguientes objetivos:

• Establecer una base sólida de comunicaciones en la capa de enlace de datosdetallada en el modelo de comunicaciones OSI.

• Realización de una librería de funciones para el lenguaje de programaciónC++ que tenga el propósito de facilitar la programación de futuros proyectosdonde se precisen opciones de comunicación de caracteres.

• Realización de un programa cuya aplicación trate de transmitir ficheros entredos sistemas conectados a la Red Telefónica Conmutada mediante el uso delprotocolo X-Módem.

• Realizar un estudio individual de los diferentes elementos involucrados en elsistema de comunicaciones (como módems, uarts y protocolos) y el modo deinteractuar entre ellos.

Page 7: Comunicación de dos ordenadores mediante el …deeea.urv.cat/public/PROPOSTES/pub/pdf/517pub.pdf · sistema de comunicaciones es captar señales digitales y modularlas para la emisión

2. DESCRIPCIÓN DEL SISTEMA Comunicación de dos ordenadores con protocolo x-módem

5

2 DESCRIPCIÓN DEL SISTEMA

2.1. INTRODUCCIÓN

Este apartado tiene el propósito de realizar una explicación no exhaustiva de laconstitución de un sistema de comunicaciones para aclarar donde se encuentra ubicado elpresente proyecto y los elementos que lo constituyen.

2.2. SISTEMA DE COMUNICACIONES

En un sistema de comunicaciones se distinguen diferentes partes claramentediferenciadas según su ubicación en el sistema o la función que desempeña en el mismo.

Si partimos de la primera diferenciación, es decir, si el sistema de comunicaciones lodesglosamos según la ubicación que ocupa, podemos considerar los siguientes elementos:

Figura 1. Sistema de comunicaciones

• DTE: Acrónimo proveniente de Data Terminal Equipment. Es la parte del sistemade comunicaciones encargado de enviar y recibir información mediante lacodificación y decodificación de datos.

• DCE: Acrónimo proveniente de Data Communication Equipment. Es la parte delsistema de comunicaciones encargado de adaptar las señales a enviar por el mediode transmisión determinado.

La opción escogida para realizar el intercambio de información entre los dos equiposes la de utilización de módems. Particularmente, en el esquema presentado encima de estaslíneas, el módem se ubica en el bloque DCE.

El módem es un elemento que tiene la misión de adaptar las señales digitalesprovenientes del DTE, que en este caso será el PC, en una señal apta para viajar por laRTC. El vocablo módem proviene de la simplificación y la unión de dos palabras:MODulador – DEModulador. Como su propio nombre indica, la misión que tiene en unsistema de comunicaciones es captar señales digitales y modularlas para la emisión dedatos por el medio de transmisión, o captar esas señales en la zona de recepción ydemodularlas convirtiéndolas en las señales digitales iniciales.

En el mundo de las comunicaciones existe un modelo, desarrollado por ISO, querecibe el nombre de modelo OSI. Este modelo estandarizado suministra una catalogaciónfuncional de las diferentes partes de un sistema de comunicaciones, dando de forma

Page 8: Comunicación de dos ordenadores mediante el …deeea.urv.cat/public/PROPOSTES/pub/pdf/517pub.pdf · sistema de comunicaciones es captar señales digitales y modularlas para la emisión

2. DESCRIPCIÓN DEL SISTEMA Comunicación de dos ordenadores con protocolo x-módem

6

conceptual, información sobre las tareas que se deberán desarrollar en cada una de esascapas definidas.

Un sistema de transmisión se puede catalogar en las siguientes capas funcionales:

Capa 1Física

Capa 2Enlace de datos

Capa 3Red

Capa 4Transporte

Capa 5Sesión

Capa 6Presentación

Capa 7Aplicación

Capa 1Física

Capa 2Enlace de datos

Capa 3Red

Capa 4Transporte

Capa 5Sesión

Capa 6Presentación

Capa 7Aplicación

M E D I O D E C O M U N I C A C I Ó N

Sistema A Sistema B

Figura 2. Modelo de comunicaciones OSI.

Donde cada capa asume una función determinada que se explicita a continuación:

• Capa 7: Aplicación. Esta capa se encarga de presentar el entorno mediante elcual el usuario tendrá acceso a la red y a sus diferentes servicios. De esemodo, el usuario simplemente se limita a manipular datosindependientemente de los aspectos técnicos precisos para establecer lacomunicación.

• Capa 6: Presentación. Esta capa se dedica a cifrar los datos y a comprimirlospara facilitar su transmisión. También se encarga de obtener los paquetes dedatos de la capa de presentación y transformarlos a un formato genérico quepodrá manipular cualquier computador.

• Capa 5: Sesión. La capa de sesión se encarga de establecer la comunicación ola sesión entre los sistemas emisor y receptor. Tras haber realizado laconexión entre ambos nodos, esta capa de sesión se dedica a introducir puntosde control en la secuencia de datos. Esto permite insertar una cierta toleranciaa los fallos en el sistema de comunicación. Por ejemplo, en caso que se pierdala comunicación entre ambos nodos, solamente se deberá emitir los datossituados desde el último punto de control recibido.

• Capa 4: Transporte. Esta capa se encarga controlar el flujo de datos entre losnodos conectados. También se encarga de controlar que el tamaño de losbloques de datos sea el requerido por las capas inferiores del conjunto deprotocolos.

• Capa 3: Red. La capa de red se encarga de establecer el enrutamiento quedebe seguir el bloque de datos.

• Capa 2: Enlace de datos. Esta capa se encarga de transformar los paquetes dedatos en tramas, que vienen definidas por la arquitectura de la red que se estáutilizando. Con el propósito de evitar la transmisión y recepción de datoserróneos, se introduce una serie de elementos de control.

• Capa 1: Física. En esta capa la secuencia de datos pasa a convertirse en unaconsecución de bits que pueden transmitirse por el entorno físico de la red.

Page 9: Comunicación de dos ordenadores mediante el …deeea.urv.cat/public/PROPOSTES/pub/pdf/517pub.pdf · sistema de comunicaciones es captar señales digitales y modularlas para la emisión

2. DESCRIPCIÓN DEL SISTEMA Comunicación de dos ordenadores con protocolo x-módem

7

2.3. DESCRIPCIÓN DEL DCE: El módem

El DCE se constituye del elemento que tiene el objetivo de adaptar las señales deinformación a señales aptas para su transmisión por el medio de comunicación. En nuestroproyecto este dispositivo es el módem.

El módem es un dispositivo que permite al computador comunicarse a través de lalínea telefónica diseñada para la transmisión de voz. Por tanto, un módem es un dispositivocapaz de convertir la red existente en una red de computadores.

La nomenclatura de este dispositivo parte de las funciones básicas a las que sededica: MODula y DEModula. Su funcionamiento viene definido por la tarea que efectúaen un momento determinado. Decimos que efectúa modulaciones de las señales binarias deinformación cuando transmite datos hacia el medio, es decir, el módem se sitúa en la zonade emisión en el sistema de comunicaciones. De forma contraria, trabaja comodemodulador de las señales adaptadas cuando se encuentra en la zona de recepción dedatos.

El circuito modulador capta secuencias de bits de datos y aplica las técnicas demodulación a una señal portadora de acuerdo a esos bits. Contrariamente, el circuitodemodulador capta una señal con portadora modulada y extrae la secuencia de bits usadapara modular la señal.

Debido al ancho de banda reducido de la línea telefónica, se consigue aumentar elvolumen de datos transmitidos mediante los métodos de compresión de datos. También esimportante los métodos de detección de errores debido a la gran vulnerabilidad de la señalanalógica presente en el medio de comunicación.

Por tanto, podemos resaltar como características importantes las técnicas demodulación, los métodos de detección de error y los métodos de compresión de datos.

Estándares de modulación

Existen tres técnicas utilizadas para efectuar la función de modulación:

• Modulación por desplazamiento de fase (PSK). Se basa en efectuar cambiosde fase de la señal portadora según la existencia de un ‘1’ o un ‘0’. Por normageneral, un ‘0’ lógico no supone ningún desfase contrariamente de lo quesucede cuando existe un ‘1’ lógico, efectuando un desfase de 180º.

• Modulación por desplazamiento en frecuencia (FSK). Se basa en lautilización de dos señales de diferente frecuencia de forma que conmute entreuna y otra según el valor binario. Previamente se debe asignar una frecuenciaa cada estado lógico (‘0’ y ‘1’).

• Modulación de amplitud de cuadratura (QAM). Este método se basa en PSKy variación de amplitud. Se tienen dos señales analógicas de diferentefrecuencia de portadora y diferente amplitud. Cada señal se asigna a unestado lógico determinado.

Page 10: Comunicación de dos ordenadores mediante el …deeea.urv.cat/public/PROPOSTES/pub/pdf/517pub.pdf · sistema de comunicaciones es captar señales digitales y modularlas para la emisión

2. DESCRIPCIÓN DEL SISTEMA Comunicación de dos ordenadores con protocolo x-módem

8

Métodos de detección y corrección de error

Debido a la existencia de diversos factores (como ruido blanco, ecos y diafonías) quepueden ocasionar errores en los datos que viajan por la línea, es preciso la utilización deprotocolos detectores de error.

Para detectar y corregir errores se puede utilizar dos técnicas diferenciadas: técnicasARQ y técnicas FEC.

Las técnicas tipo ARQ son las denominadas de petición de repetición automática, oen inglés Automatic Repeat Request. Se caracteriza por ser el sistema receptor el encargadode realizar la petición de la información de nuevo o no. Así, el sistema emisor es elencargado de transmitir la trama de datos recibida incorrectamente.

Se puede distinguir tres técnicas de tipo ARQ:

• Stop – and – Wait: El transmisor emite una trama de datos y espera a que elreceptor informe de su reconocimiento mediante un carácter ACK. Si existealgún error en la transmisión, el receptor envía un carácter de reconocimientonegativo (NAK) para que el sistema transmisor repita el envío de datos. Si noexiste error en los datos, el transmisor interpreta que el envío es correcto y sedispone a realizar el envío de la siguiente trama.

• Go – back – N: El transmisor emite un conjunto de tramas de datos yposteriormente recibe un reconocimiento por parte del sistema receptor. Siexiste algún error en alguna de las tramas enviadas, el sistema receptor ladescarta e ignora las siguientes. Posteriormente informa al sistema transmisorla trama errónea para que reenvíe todas las tramas desde la indicada. Elnúmero de tramas a enviar debe ser previamente asignado.

• Selective – repeat: El transmisor emite un conjunto de tramas de datos yúnicamente emite las que son reconocidas negativamente. A medida que seenvían datos y existen errores, el transmisor recibe NAK sin afectar el flujode emisión. Los datos reenviados se introducen en el flujo del mensaje aemitir. Antes de iniciar una nueva emisión de secuencia de tramas debeatender todas las peticiones de repetición.

La técnica tipo FEC es la denominada Corrección de Error hacia Delante, o en inglésForward Error Correction, se basa en que el sistema transmisor codifique el mensaje atransmitir en una forma reconocida por parte del sistema receptor, de modo que éste seacapaz de detectar los errores y corregirlos. Por tanto, este método da una independencia deactuación al sistema receptor por no requerir ayuda por parte del sistema transmisor. Estossistemas son más complejos que los de tipo ARQ. Podemos mencionar los códigos deBloques Lineales, Convolucionales y Cíclicos entre otros.

Page 11: Comunicación de dos ordenadores mediante el …deeea.urv.cat/public/PROPOSTES/pub/pdf/517pub.pdf · sistema de comunicaciones es captar señales digitales y modularlas para la emisión

2. DESCRIPCIÓN DEL SISTEMA Comunicación de dos ordenadores con protocolo x-módem

9

Compresión de datos

La compresión de datos tiene el objetivo de utilizar menos cantidad de bits parasuministrar la misma información en la transmisión. Así, teniendo la misma filosofía que latécnica tipo FEC, el sistema transmisor realiza una codificación de datos de modo que elsistema receptor es capaz de reconocer y de decodificar. Existen dos técnicas decompresión muy extendidas:

• Norma V.42 bis (Procedente del CCITT). Esta norma consigue ratios de hasta4:1, es decir, envía hasta cuatro veces más cantidad de información que en elcaso de no utilizar ninguna técnica de compresión de datos. Es una normadiseñada para utilizarla junto el protocolo de corrección de errores V.42.

• Microcom Network Protocol (MNP). Este basa su esquema en dos tipos dealgoritmos: codificación Huffman y codificación Run Length. El primero sebasa en la emisión de los caracteres que más aparecen en grupos de cuatrobits, mientras que los que menos aparecen, en grupos de 11 bits. De esa formase consigue un aumento de velocidad de transmisión considerable. Elsegundo método de codificación se basa en enviar el carácter correspondienteseguido de la cuenta de repeticiones que resume el número de veces que serepite ese carácter.

Finalmente comentar que el algoritmo utilizado en la Norma V.42 bis es máseficiente que el utilizado en el MNP7, siendo el más moderno de los protocolosMicrocom.

Page 12: Comunicación de dos ordenadores mediante el …deeea.urv.cat/public/PROPOSTES/pub/pdf/517pub.pdf · sistema de comunicaciones es captar señales digitales y modularlas para la emisión

2. DESCRIPCIÓN DEL SISTEMA Comunicación de dos ordenadores con protocolo x-módem

10

2.4. DESCRIPCIÓN DEL DTE

En el siguiente diagrama se presenta los elementos que forman parte del bloqueDTE:

Figura 3. Diagrama de Bloques para un sistema INTEL

El diagrama presentado da una noción básica de la estructura de nuestro sistema y dela interacción entre los diferentes dispositivos que lo forman.

Según la estructura presentada, el control entre los diferente bloques se realizamediante peticiones de interrupción.

El PIC (Programable Interruption Controller) detectará la petición de interrupciónde uno de los tres dispositivos. Si no existe ni petición ni atención de una interrupción másprioritaria, el PIC encuesta a la CPU mediante la señal INTR (Interrupt Request) con elpropósito de conocer si es el momento oportuno de ejecutar la interrupción solicitada.

En caso afirmativo, la CPU efectúa la salvación del contador del programa, elregistro de estado y los registros de datos. Posteriormente informa al PIC mediante laemisión de dos pulsos consecutivos por la línea INTA (Interrupt Acknowledge).

También activa el bit de atención a interrupción presente en el Registro de Estadoque provoca la inhibición de todas las interrupciones. Puesto que interesa la ejecución deposibles interrupciones prioritarias, en el programa de la subrutina debemos desasertar esebit.

El primer pulso servirá para informar al PIC de que se acepta la petición y que activeel bit que represente el nivel de interrupción a tratar del ISR (In Service Register).Seguidamente desactiva el bit del IRR (Interrupt Request Register). En el segundo pulsorecibido por la línea INTA, el PIC extrae al bus de datos la dirección donde se encuentra ladirección de la subrutina de atención a la interrupción a ejecutar (dirección del vector deinterrupción). La CPU capta esa dirección por el bus de datos y la ubica en el bus dedirecciones con el propósito de obtener la dirección de la subrutina a tratar. Una vez

Page 13: Comunicación de dos ordenadores mediante el …deeea.urv.cat/public/PROPOSTES/pub/pdf/517pub.pdf · sistema de comunicaciones es captar señales digitales y modularlas para la emisión

2. DESCRIPCIÓN DEL SISTEMA Comunicación de dos ordenadores con protocolo x-módem

11

obtenida esa dirección, la CPU vuelve a captar la dirección del bus de datos y la ubica en elbus de direcciones para iniciar la ejecución de la subrutina.

El bit del ISR permanecerá activo hasta que se informe de la finalización deejecución de la subrutina. En ese momento, la CPU restaura su estado al anterior de laejecución de la subrutina cargando el Contador del Programa, el Registro de Estado y losregistro de datos que disponía anteriormente.

El dispositivo más prioritario es el temporizador de intervalo programable, ubicadoen el nivel de interrupción 0, lo cual la convierte en la única interrupción no emmascarable.

El teclado se encuentra en el nivel 1 y la UART en el nivel 3 ó 4 según el puertoserie escogido.

La subrutina de atención a la interrupción de reloj se basa en un triple contadorsoftware.

La misión de esos contadores es contabilizar el tiempo que transcurre desde lalimpieza de los mismos con el objetivo de controlar tiempos de pausa o de control durantela ejecución del programa.

La subrutina de atención a la interrupción de teclado cumple con los objetivos dedecodificación de la tecla pulsada y determinación de los valores de determinadas variablesglobales para un correcto desarrollo en la ejecución del programa.

Finalmente, se tiene una subrutina de atención a la UART que básicamente tiene elpropósito de indicar el estado de los registros RBR (Receiver Buffer Register) y THR(Transmitter Holding Register) para controlar el flujo de datos con el módem.

Page 14: Comunicación de dos ordenadores mediante el …deeea.urv.cat/public/PROPOSTES/pub/pdf/517pub.pdf · sistema de comunicaciones es captar señales digitales y modularlas para la emisión

2. DESCRIPCIÓN DEL SISTEMA Comunicación de dos ordenadores con protocolo x-módem

12

2.5. DESCRIPCIÓN DE LA RED TELEFÓNICA CONMUTADA (RTC)

La RTC (Red Telefónica Conmutada) es una red pública a la que se puede accederlibremente a gran variedad de aplicaciones, como la transmisión de voz, textos, imágenes yotros datos.

En una comunicación de hablada, la voz es recogida desde el teléfono mediante unmicrófono. Posteriormente ,esa señal analógica llega hasta una central donde se digitaliza yse une con otros canales de voz que lleven el mismo camino enrutándose en función delnúmero marcado. En la central de destino se decide por qué canal ha de salir lacomunicación y se transforma la señal digital en analógica para que el teléfono puedareproducir el sonido original.

Debido a la gran cantidad de usuarios de la RTC provoca que se tengan que agruparpor áreas geográficas y hacerlos depender de varias centrales de conmutacióninterconectadas entre sí. Así, podemos decir que la RTC es una red jerarquizada, donde sedistinguen dos niveles:

• Nivel local. Formado por centrales locales, cabeceras (centralizan el tráficode un área determinada) y unidades remotas. De las cabeceras puedendepender a su vez centrales privadas y a otros sistemas de comunicaciones.

• Nivel de tránsito. Este nivel es el accedido por parte del usuario cuando elabonado al que se llama no se encuentra en la zona cubierta por los recursoslocales. A este nivel, existen nodos de control de señalización queinterconectan varias centrales locales. También puede existirinterfuncionamiento con redes móviles, permitiendo al abonado convencionalllamar a un abonado de una red móvil o viceversa

Los medios de transmisión de la RTC se encargan de transportar señales (entre 300 Hz y3400 Hz) con las menores pérdidas y distorsiones. Se distinguen dos tramos diferenciados:bucle de abonado, que conecta al abonado con la central más próxima; y el que conectavarias centrales entre sí.

Page 15: Comunicación de dos ordenadores mediante el …deeea.urv.cat/public/PROPOSTES/pub/pdf/517pub.pdf · sistema de comunicaciones es captar señales digitales y modularlas para la emisión

2. DESCRIPCIÓN DEL SISTEMA Comunicación de dos ordenadores con protocolo x-módem

13

2.6. PROTOCOLOS DE ENLACE DE DATOS

Según Rudolf F. Graf, un protocolo es un conjunto de reglas que determinan elformato y sincronizan los intercambios de mensajes para controlar las transmisiones dedatos y corregir errores. Con esta definición se observa claramente la intención yobligación de un protocolo: controlar la transmisión de datos de forma fiable.

2.6.1. Introducción

Se puede diferenciar dos tipos de protocolos en el mundo de la comunicaciones:protocolos orientados al carácter y protocolos orientados al bit.

Los protocolos comenzaron a surgir y a desarrollarse en la década de los sesenta.Hacia 1962, se desarrollaron protocolos poco estructurados y que cuya unidad deinformación era el carácter. La unidad de información se encontraba codificada en tablas,de forma que había que realizar la decodificación de esos datos transmitidos para obtenerel carácter determinado. A lo largo del chorro de información transmitido, se intercalabadeterminados caracteres de control para mantener un conocimiento mínimo del estado de latransmisión. Pero la poca estructuración y la exigencia de un orden en los sistemas decomunicación, cada vez más desarrollados y complejos, impulsó a la realización deprotocolos orientados al bit.

Los protocolos orientados al bit son estructurados y cumplen un orden. Secaracterizan por utilizar bits o grupos de bits como unidad de información sin estar ligado aun determinado código. Son protocolos que codifican la información en estructuras dedatos organizadas en partes, de forma que los protocolos pueden anidarse en capas. Elhecho de ser protocolos organizados que cumplen con la normalización OSI (Open SystemInterconnection) hace que sea el tipo más utilizado en sistemas de comunicacionesactualmente.

Las funciones principales que tiene que asumir un protocolo son las siguientes:

• Inicialización y terminación lógica del enlace.

• Sincronización.

• Control del enlace.

• Detección y corrección de errores.

• Control de flujo.

En el presente proyecto se utiliza un protocolo orientado al carácter debido a lasimplicidad que suponen y por no ser necesaria la transmisión de un gran volumen dedatos. Concretamente se utilizará el protocolo X-MODEM por ser de dominio público y norequerir licencias para su utilización.

Seguidamente observaremos la estructura que tiene este protocolo desarrollado porWard Christensen, aficionado a los ordenadores residente en Chicago.

Page 16: Comunicación de dos ordenadores mediante el …deeea.urv.cat/public/PROPOSTES/pub/pdf/517pub.pdf · sistema de comunicaciones es captar señales digitales y modularlas para la emisión

2. DESCRIPCIÓN DEL SISTEMA Comunicación de dos ordenadores con protocolo x-módem

14

2.6.2. El protocolo X-MODEM

Los protocolos orientados al carácter siempre siguen una codificación de los bitsrecibidos según una determinada tabla. Concretamente, el protocolo X-MODEM siguen lacodificación de caracteres ASCII básico, también conocido como Alfabeto Internacionalnº5 o CCITT nº5. Esta codificación utiliza 7 bits significativos lo cual suministra hasta untotal de 128 combinaciones. Se organiza en 8 columnas de 16 filas (caracteres), donde lasdos primeras columnas constituyen el subconjunto de caracteres no imprimibles de control,y las demás columnas el subconjunto de caracteres de texto.

Seguidamente se presenta la tabla de codificación ASCII básico:

Der 000 001 010 011 100 101 110 111Izq 0 1 2 3 4 5 6 70000 NUL DLE SP 0 @ P ` p

0 0 16 32 48 64 80 96 1120001 SOH DC1 ! 1 A Q a q

1 1 17 33 49 65 81 97 1130010 STX DC2 " 2 B R b r

2 2 18 34 50 66 82 98 1140011 ETX DC3 # 3 C S c s

3 3 19 35 51 67 83 99 1150100 EOT DC4 $ 4 D T d t

4 4 20 36 52 68 84 100 1160101 ENQ NAK % 5 E U e u

5 5 21 37 53 69 85 101 1170110 ACK SYN & 6 F V f v

6 6 22 38 54 70 86 102 1180111 BEL ETB ' 7 G W g w

7 7 23 39 55 71 87 103 1191000 BS CAN ( 8 H X h x

8 8 24 40 56 72 88 104 1201001 HT EM ) 9 I Y i y

9 9 25 41 57 73 89 105 1211010 LF SUB * : J Z j z

A 10 26 42 58 74 90 106 1221011 VT ESC + ; K [ k {

B 11 27 43 59 75 91 107 1231100 FF FS ´ < L \ l |

C 12 28 44 60 76 92 108 1241101 CR GS - = M ] m }

D 13 29 45 61 77 93 109 1251110 SO RS · > N ^ n ~

E 14 30 46 62 78 94 110 1261111 SI US / ? O _ o DEL

F 15 31 47 63 79 95 111 127

Caracteres de control

SOH = Start Of Header

STX = Start Of Text

ETX = End Of Text

EOT = End Of Transmission

ENQ = Enquire

ACK = Acknowledge

NAK = No Acknowledge

SYN = Synchronism

ETB = End Of Block

DC1 = XON

DC3 = XOFF

DLE = Data Link Escape

Page 17: Comunicación de dos ordenadores mediante el …deeea.urv.cat/public/PROPOSTES/pub/pdf/517pub.pdf · sistema de comunicaciones es captar señales digitales y modularlas para la emisión

1. OBJETIVOS Comunicación de dos ordenadores con protocolo x-módem

15

El protocolo X-MODEM es del tipo Stop&Wait, es decir, el sistema emisor emiteuna trama de datos y espera el reconocimiento por parte del sistema receptor. Por esemotivo, este protocolo fuerza el sistema de comunicaciones al tipo Half-Duplex, es decir,el sistema no tiene capacidad de asumir los datos enviados por el emisor al mismo tiempoque éste emite otros.

Este protocolo sigue la siguiente estructura:

La transferencia de datos se realiza mediante la emisión de bloques, con la formamostrada. Inicialmente se envía el bit de inicio de trama de datos SOH, ASCII (0x01)HEX.

Posteriormente se transmite el número de bloque del que se trata para informar delestado de la transmisión de datos. Como control de error se emite el número de bloque encomplemento a 1. Seguidamente los 128 bytes que representan la cadena de caracteres atransmitir.

Finalmente se envía el byte de CHecKsum, que tiene el propósito de controlar lacorrecta transmisión de los 128 caracteres. La fórmula que sigue es la siguiente:Primeramente realiza la suma de los 128 bytes para dividir posteriormente entre 256. Elvalor del CHecKsum resultará de la captura del resto de esa operación. Es decir, el valordel CHecKsum no será más que la representación de los 8 bits menos significativos de esasuma.

La detección de un error se establece mediante la diferencia entre el CHecKsumrecibido del sistema emisor y el obtenido de la trama recibida. Por tanto, se puede observarque esta operación se deberá realizar desde los dos sistemas que transfieren datos.

Para establecer el control entre los dos sistemas se utilizan los caracteres de controlsiguientes:

ACK (Akcnowledge) = Carácter de reconocimiento que indica la correcta recepciónde un dato determinado.

NAK (No Acknowledge) = Carácter de no reconocimiento que indica que existealgún error en la trama de datos recibida e informa la necesidad de retransmitir de nuevo.

CAN (CANcel) = Carácter de Cancelación de la transmisión. Servirá para informar eldeseo de finalizar la transmisión de datos por esperas prolongadas o debido a la recepciónreiterada prolongada de una trama incorrecta de datos.

Page 18: Comunicación de dos ordenadores mediante el …deeea.urv.cat/public/PROPOSTES/pub/pdf/517pub.pdf · sistema de comunicaciones es captar señales digitales y modularlas para la emisión

2. DESCRIPCIÓN DEL SISTEMA Comunicación de dos ordenadores con protocolo x-módem

16

EOT (End Of Transmission) = Carácter de final de transmisión. Indicará que noexisten más bloques para transmitir e informará del deseo de cerrar una transmisiónsatisfactoria.

2.6.3. Funcionamiento del protocolo X-MODEM

Sistema Emisor

Tras el establecimiento de una comunicación a nivel físico con el sistema receptor, esdecir, después de establecer comunicación por parte de los módems entre sí, el sistemaemisor inicia una temporización de 1 minuto a la espera de recibir un carácter dereconocimiento (ACK).

En cuanto recibe ese carácter emitido por el sistema receptor, el sistema emisorinterpreta que su interlocutor se encuentra listo para iniciar la transferencia de datos. Elnúmero del bloque inicial es el 1. Eso se indicará mediante la emisión del segundo byteBLK. Puesto que el tamaño de ese dato es de 8 bits, el valor máximo de bloques atransmitir será de 256, siendo el 0 el último bloque. Si se desea transmitir más grupos debloques, simplemente habrá que realizar el control de ese contador de forma que se reinicieantes de su desbordamiento. De forma contraria, el byte BLC informará del número debloque en complemento a 1, es decir, conteniendo el valor de 255-BLK, de forma que elbloque primero corresponda a BLC = (0xFE)HEX y el último a BLC = (0xFF)HEX.

Posteriormente se emite la trama de bytes de datos que contendrán caracteres detexto. En caso que exista una carencia de caracteres para cargar la trama de 128 bytes, sedebe rellenar con caracteres NUL (0x00)HEX. Seguidamente se realizará el cálculo delChecksum.

Si la trama emitida es correcta, el sistema recibido emite un carácter ACK. En casocontrario emitirá un NAK. Si se desea cancelar la transmisión, emitirá un CAN.Finalmente, el sistema emisor emite un carácter EOT que indica la inexistencia de máscaracteres a transmitir y el deseo de finalizar la transmisión. Posteriormente, debe recibirun carácter ACK que interpretará como que el receptor ha validado esa petición definalización.

Page 19: Comunicación de dos ordenadores mediante el …deeea.urv.cat/public/PROPOSTES/pub/pdf/517pub.pdf · sistema de comunicaciones es captar señales digitales y modularlas para la emisión

2. DESCRIPCIÓN DEL SISTEMA Comunicación de dos ordenadores con protocolo x-módem

17

NODato = ACK?

Sistema Emisor

Dato = NAK? NO

Calcula Checksum NIE++

Transmisión incorrecta

Transmisión correcta

Leer dato

Envia SOH Envia BLK

Envia BLCEnvia 128 Bytes

Envia CHK

Leer dato

NO

TimeOut = 1? SÍ NIE < 10?

NO

Envia EOT Leer dato

Dato = ACK? NOSÍ

Dato = CAN?

NO

NIE++

Figura 4. Organigrama de la emisión de un bloque X-MODEM.

Sistema Receptor

Una vez establecida la comunicación entre los dos módem, el sistema receptor es elencargado de informar al sistema emisor que se encuentra preparado para recibir datos y deesa forma indicar que desea iniciar la transmisión de datos. El modo que utiliza parainformar esa disposición es emitiendo un carácter NAK.

El sistema receptor iniciará la cuenta del tiempo en que espera la recepción de unSOH indicativo de inicio de trama de datos. Cada 10 segundos emitirá una señal NAK encaso de no percibir noticia alguna del sistema emisor. Este proceso lo repetirá hasta larecepción de noticias del emisor o hasta que haya emitido un total de 10 caracteres NAK.

En el momento que percibe el SOH, captura el número de bloque indicado por BLKy el número de bloque en complemento a 1 verificando que se trate del bloque correcto.Posteriormente recibirá los 128 bytes de caracteres y continuará con la percepción del byteCHK. En última instancia, el sistema receptor realizará el cálculo del Checksum a partir delos datos recibidos. Finalmente efectuará una comparación entre el byte CHK recibido y elChecksum recalculado. En caso de tratarse de valores diferentes informará al emisor de queel dato recibido es incorrecto mediante la emisión de un carácter NAK. Posteriormente sepreparará para la recepción de nuevo del bloque incorrectamente transmitido.

Page 20: Comunicación de dos ordenadores mediante el …deeea.urv.cat/public/PROPOSTES/pub/pdf/517pub.pdf · sistema de comunicaciones es captar señales digitales y modularlas para la emisión

2. DESCRIPCIÓN DEL SISTEMA Comunicación de dos ordenadores con protocolo x-módem

18

En caso de obtener un número de bloque incorrecto o alguna incongruencia entre elnúmero de bloque y su negado, responderá también mediante la emisión de un carácterNAK tras haber recibido todo el bloque. Se podría pensar en cortar la transmisión de datosen el preciso instante que se detecta la anomalía. Debido al uso de un sistema Half Duplexse hace imposible esta idea.

BLK OK?

Sistema Receptor

Dato = SOH? NO

Calcula Checksum

Recepcion Correcta

RecepciónIncorrecta

Envia NAK

Leer BLK Leer BLC

Leer 128 BytesLeer CHK

NO

BLC OK?

NIE++

Leer dato

Dato = EOT? NO

NIE++

NIE < 10?

SÍ NO

NO

CHK OK? NO

Envia ACK

Envia ACK

Figura 5. Organigrama de la recepción de un bloque X-MODEM.

3 PRESENTACIÓN DEL PROBLEMA Y POSIBLESSOLUCIONES

La comunicación de sistemas y el control de flujo de datos tiene gran diversidad demétodos y formas por ser uno de los campos más desarrollados en los últimos tiempos.

Un sistema de comunicaciones puede venir definido por la siguientes partes o zonas:

Page 21: Comunicación de dos ordenadores mediante el …deeea.urv.cat/public/PROPOSTES/pub/pdf/517pub.pdf · sistema de comunicaciones es captar señales digitales y modularlas para la emisión

3. PRESENTACIÓN DEL PROBLEMA Y POSIBLES SOLUCIONES Comunicación de dos ordenadores con protocolo x-módem

19

Figura 6. Zonas del sistema.

Por tanto, una vez observado las zonas que resumen las diferentes responsabilidadespara un comportamiento global válido, podemos describir las diferentes formas de realizarla determinada tarea asumiendo correctamente la responsabilidad asignada.

Observando el sistema desde un punto de vista global, podemos diferenciar en elsistema de comunicaciones el DTE y el DCE.

Respecto al DCE, en nuestro sistema es claro que utilizaremos un sistema capaz deefectuar modulaciones y demodulaciones sobre una línea de cobre o sobre la RTC. Estedispositivo, conocido con el nombre de módem, puede ser de diversas formas según suinstalación en el sistema. Para realizar la comunicación entre esos dos sistemas se puedeoptar entre la utilización de módem internos o externos. En nuestro proyecto se ha optadopor utilizar módems externos por los motivos ventajosos que supone este tipo frente alinterno.

El módem de tipo externo es más simple de usar puesto que no requiere elconocimiento técnico del funcionamiento interno de éste y su instalación es rigurosamentemás simple por comunicarse con la UART. La ventaja que supone la utilización de unmódem interno es su coste reducido. Se podría pensar que el módem interno es más rápidoque el externo puesto que el primero se conecta directamente al bus PCI, empero elsegundo se conecta a una UART. Analizando el ancho de banda que dispone la RTC seobserva que mediante la utilización de un módem de 56 kbps se restringe esa velocidad a42 kbps. Por ende, no tiene sentido pensar en módems más rápidos.

La siguiente problemática es optar por un tipo determinado de control del flujo dedatos entre la UART y el módem. Se puede distinguir el control por software y el controlpor hardware.

El control por software requiere menos conocimiento del dispositivo UART y delmódem. El control se realiza mediante la emisión de los caracteres XON y XOFF. Losdispositivos informan de su estado actual mediante esos dos caracteres, de forma quecuando existe posibilidad de recepción de datos de uno de los dispositivos (PC o UART),se emite el carácter XON. En caso contrario, es decir, en caso de que alguno de losdispositivos se encuentre indispuesto para tratar con más transmisiones de datos, emiteXOFF por la línea serie. Este método dispone de la ventaja de permanecer más aislado alhardware existente entre el DTE y el DCE, pero no es un buen método por ralentizar elproceso de emisión de datos y ocupar la línea para establecer el control.

El control de flujo por hardware se realiza mediante la utilización de las líneas RTS yCTS. La señal de petición de envío RTS es la encargada de informar al módem que el DTEse encuentra dispuesto para transmitir datos. Así, la señal CTS indica si el módem estádispuesto o no a la recepción esos datos emitidos por la UART .

Este último método comentado requiere de un conocimiento técnico del control deesas líneas y por tanto involucra al programador directamente con el hardware del sistema.

Page 22: Comunicación de dos ordenadores mediante el …deeea.urv.cat/public/PROPOSTES/pub/pdf/517pub.pdf · sistema de comunicaciones es captar señales digitales y modularlas para la emisión

3. PRESENTACIÓN DEL PROBLEMA Y POSIBLES SOLUCIONES Comunicación de dos ordenadores con protocolo x-módem

20

Eso provoca que sea un método más complejo que el del control de flujo por software,pero lo convierte en un método más rápido y por tanto más apto para llevar a cabo eldesarrollo del proyecto.

Finalmente, se debe establecer el formato de control entre el software de control deflujo y almacenaje de datos y la UART. Precisamente, debido a la utilización de un módemexterno conectado con la UART, facilita grandemente ese control de flujo de datos puestoque se limita exclusivamente a observar el estado de los registros de datos y los registrosde estado. La estructura algorítmica de nuestro programa podrá realizarse medianteencuesta o mediante interrupciones.

El método de control mediante encuesta se basa en someter a la CPU en unaconstante encuesta de los registros de estado pertenecientes a los periféricos que a ella seconectan. En este caso habría que encuestar continuadamente los registros LSR y MSRpara establecer el control de flujo entre UART y módem. En esos registros existeinformación sobre el estado de los registros de datos RBR y THR, además del estado de laslíneas RTS y CTS fundamentales para realizar el control de flujo.

Este método tiene la ventaja de facilitar la programación del sistema por no sernecesario el conocimiento de información técnica del controlador de interrupciones 8259.También implica un formato algorítmico más simple sin la necesidad de crear subrutinas nideclarar variables globales. Pero la gran desventaja que supone un sistema realizadomediante encuesta es el gran derroche temporal que supone para la CPU el hecho de estar aexpensas de un determinado periférico, dedicando la mayor parte de su tiempo a norealizar ningún tipo de tarea. Por ese motivo, la utilización de este método por encuesta noes apto para llevar a cabo el desarrollo del proyecto.

El método de control del periférico mediante la utilización de interrupciones es útilen sistemas donde existe diversidad de elementos periféricos, los cuales deben seratendidos por la CPU en el momento preciso. En nuestro sistema se requiere la utilizaciónde un contador temporal, el dispositivo de comunicación asíncrona y el teclado.Lógicamente, mediante el uso del método encuesta haría inviable el desarrollo delalgoritmo porque la CPU estaría continuamente sometida a encuestar el contador de timer,con una precisión de 56 milisegundos aproximadamente, no pudiendo reaccionar enconsecuencia de un determinado estado de los otros dispositivos.

La desventaja que aporta este sistema es que eleva la complejidad del algoritmo portener que generar rutinas de atención a interrupciones que pueden variar determinadasvariables globales en un momento determinado. Sin un control adecuado y sin el cuidadopreciso a la hora de establecer el valor de una de estas variables se pueden producir erratasque trastornen el funcionamiento del sistema. Pero a pesar de esta particularidad, se haceevidente de la obligación del uso de este método de programación.

Finalmente queda determinar la velocidad de viaje de los datos transferidos desde unsistema emisor hasta un sistema receptor. Se abre aquí la problemática del método autilizar para determinar la velocidad adecuada de transmisión de la UART y la del módem.

En el proceso de transmisión podemos destacar tras casos:

• Misma velocidad de transmisión entre UART y módem. En este caso noexistirá ningún problema puesto que los datos, salientes por la línea serie desalida (SOUT) de la UART, serán captados y modulados por el módem a lamisma velocidad de salida hacia otro módem receptor.

Page 23: Comunicación de dos ordenadores mediante el …deeea.urv.cat/public/PROPOSTES/pub/pdf/517pub.pdf · sistema de comunicaciones es captar señales digitales y modularlas para la emisión

3. PRESENTACIÓN DEL PROBLEMA Y POSIBLES SOLUCIONES Comunicación de dos ordenadores con protocolo x-módem

21

• Velocidad de transmisión de la UART superior a la del módem. Este es elcaso en que existe un cuello de botella en el módem. Siempre se debe evitarpuesto que ralentiza grandemente la transferencia por generar errores. A pesarde que se atienden los errores y que se solventa, es un caso absolutamenteevitable.

• Velocidad de transmisión del módem superior a la de la UART. En este casono existirá ningún error en la transmisión, además de ser un caso preferible alprimero comentado. Si la velocidad de transmisión del módem es superior ala de emisión de datos por parte de la UART, la información fluirá sinproblemas y además suministrará un intervalo de tiempo adicional al módem.En nuestro caso, intentaremos llegar a esta opción por ser la más favorable.

En el proceso de recepción de datos, también cabe destacar los siguientes casos:

• Misma velocidad de recepción de datos entre UART y módem. En este casono se hará presente ningún problema, a no ser que exista una demora poralguna causa y exista una sobreescritura (Error de Overrun) sobre elpenúltimo dato recibido en el RBR. En este caso, simplemente se tratará elerror informando de la anulación de un dato y efectuando la solicitud dereiterar la transferencia.

• Velocidad de recepción de datos del módem superior a la de la UART. Eneste caso se genera un cuello de botella en la UART debido a que llegan másdatos por su línea serie de entrada (SIN) de los que puede asumir. Esoprovoca continuos errores de sobreescritura y por lo tanto, hace inviable eldesarrollo del proyecto.

• Velocidad de recepción de datos de la UART superior a la del módem. Estees el caso más favorables de entre los tres posibles por permitir a la UARTcapturar los datos únicamente cuando se encuentren disponibles tras informarpor parte del módem.

Por tanto, la conclusión a la que desembocamos tras el análisis de los diferentescasos es que en proceso de transmisión de datos, conviene disponer de velocidades delmódem superior a las de la UART; empero, en el proceso de recepción de datos, espreferible disponer de una UART con velocidades de transmisión superiores a las delmódem.

4 DESCRIPCIÓN DE LA SOLUCIÓN ADOPTADA

En el apartado anterior se informó de las diferentes soluciones existes para llevar acabo el objetivo global del proyecto. El presente apartado se constituye de dos partes: laprimera pretende explicar los procesos necesarios para llevar a cabo la transmisión o larecepción de datos entre sistemas; por otra parte, en la segunda sección se pretende

Page 24: Comunicación de dos ordenadores mediante el …deeea.urv.cat/public/PROPOSTES/pub/pdf/517pub.pdf · sistema de comunicaciones es captar señales digitales y modularlas para la emisión

4. DESCRIPCIÓN DE LA SOLUCION ADOPTADA Comunicación de dos ordenadores con protocolo x-módem

22

describir la estructura del programa de aplicación que se ha llevado a cabo en esteproyecto.

4.1. SECUENCIA DE PROCESOS

Con el propósito de llevar correctamente a cabo la transmisión de datos, en cadasistema se deberá establecer el siguiente secuencia de pasos:

• Proceso 1: Inicialización del sistema.

• Proceso 2: Establecimiento de conexión entre módems.

• Proceso 3: Transmisión o recepción de datos.

• Proceso 4: Cierre de conexión.

• Proceso 5: Retorno a la antigua configuración al sistema

Seguidamente se efectúa una descripción de cada proceso y la forma de solventar lasposibles dificultades:

4.1.1. PROCESO 1: INICIALIZACIÓN DEL SISTEMA

El proceso de inicialización tiene el objetivo de preparar el sistema para efectuar deforma correcta la transmisión de datos y para que el usuario pueda hacer uso del entornodando las órdenes pertinentes o suministrando información necesaria para la correctaevolución del programa.

Como se ha observado en apartado anteriores, el sistema con el que tratamoscontiene diversos periféricos para suplir determinadas funciones. Por ende, debemosrealizar un análisis particular de cada elemento del sistema de comunicaciones.

Considerando todos los elementos que componen el equipo terminal de datos (Figura2), podemos distinguir la existencia de los dispositivos siguientes: el Timer, el teclado, laUART y el PIC. Estos dispositivos parten de una configuración determinada en el sistemadonde se encuentran instalados (PC) y todos ellos, excepto la UART, mantendrán la mismaconfiguración en nuestro programa.

La UART es la excepción puesto que es un dispositivo que tiene un amplio campo deutilidades y por ende, dispone de gran variedad de configuraciones.

En todos los dispositivos se realizará un redireccionamiento de su respectivasubrutina de atención a la interrupción. Por tanto el primer paso en este proceso deinicialización será almacenar la dirección de la antigua subrutina de atención a lainterrupción y asignar la nueva.

Se puede resumir el proceso de inicialización en la siguiente figura:

Page 25: Comunicación de dos ordenadores mediante el …deeea.urv.cat/public/PROPOSTES/pub/pdf/517pub.pdf · sistema de comunicaciones es captar señales digitales y modularlas para la emisión

4. DESCRIPCIÓN DE LA SOLUCION ADOPTADA Comunicación de dos ordenadores con protocolo x-módem

23

Proceso de inicialización del sistema

Captura y almacenaje de las direcciones a las subrutinas de atención a

las interrupciones

Direccionamiento delas nuevas subrutinas

de atención a las interrupciones

Selección de puertoserie a utilizar

(com_1 - com_2)

Configuración de la UART estableciendo

velocidad mínima de transmisión

Detección y asignaciónde la velocidad máximade transmisión de datos

del MODEM

Configuración de la UART estableciendo velocidad máxima detransmisión posible

Paso a proceso de conexión entre

MODEM’s remotos

Inicialización del MODEM

Figura 7. Diagrama de estados en el proceso de inicialización.

Captura y almacenaje de las direcciones a las subrutinas de atención a las interrupciones.

El PIC dispone de un registro donde se almacena la dirección base de la denominadatabla de interrupciones. Esa tabla de interrupciones es un conjunto de registros queindividualmente almacenan la dirección donde se encuentra la subrutina de atencióndeterminada.

Para poder atender la interrupción originada por uno de los dispositivos presentes enel sistema, se debe asignar la dirección de nuestra nueva subrutina en el contenido delvector determinado presente en la tabla de interrupciones.

Para realizar otras tareas después de la ejecución de nuestro programa, el sistemaoperativo requiere de sus subrutinas de atención a las interrupciones. Por ese motivo esimportante realizar el almacenaje de esas direcciones donde se encuentran las subrutinasque no vamos a utilizar. En el algoritmo utilizamos unas variables de tipo puntero ainterrupción. Para realizar el almacenaje de esas subrutinas, disponemos de las siguientes

Page 26: Comunicación de dos ordenadores mediante el …deeea.urv.cat/public/PROPOSTES/pub/pdf/517pub.pdf · sistema de comunicaciones es captar señales digitales y modularlas para la emisión

4. DESCRIPCIÓN DE LA SOLUCION ADOPTADA Comunicación de dos ordenadores con protocolo x-módem

24

variables: (*oldhandler_clk),(*oldhandler_kb) y (*oldhandler_ls), que almacenan lasdirecciones de la subrutina de atención al timer, al teclado y a la UART respectivamente.

El lenguaje de programación C++ dispone de la función getvect(), presente en lalibrería dos.h, que suministra directamente la dirección donde se almacena la subrutina deatención a partir del número de vector introducido en su variable de entrada.

Direccionamiento de las nuevas subrutinas de atención a las interrupciones.

Este paso asigna las direcciones de las nuevas subrutinas de atención a lasinterrupciones en los vectores determinados en la tabla de interrupciones.

Las nuevas subrutinas de atención a las interrupciones son las siguientes: reloj,teclado y uart. Cada una de estas tiene la misión de efectuar variaciones en los diferentesparámetros susceptibles a la efectuación de las determinadas subrutinas, provocando unefecto deseado por parte del dispositivo que efectuó la petición de interrupción.

En el lenguaje de programación C++ se dispone de una función, denominadasetvect(), que carga el vector de interrupción determinado con la dirección de la subrutinade atención.

Selección de puerto serie a utilizar

Los PC con estructura de INTEL acostumbran a contener dos dispositivos decomunicación serie, es decir, suelen presentar dos UART.

La UART representada por el puerto serie número 1 (com_1) encuentra sus registrosen el margen de memoria de entrada/salida entre la dirección 0x3F8HEX y la 0x3FFHEX. Porotro lado, la UART representada por el puerto serie número 2 (com_2) encuentra susregistros entre la dirección 0x2F8HEX y la 0x2FFHEX.

Otra distinción existente entre los dos elementos de comunicación asíncrona es laprioridad de interrupción. El puerto com_1 se ubica en el nivel de interrupción número 4,siendo de prioridad inferior a las debidas por el com_2, que se sitúa en el nivel número 3.

El hecho de disponer de dos dispositivos diferentes hace que debamos explicitar cuálde ellos va a pertenecer a nuestro sistema de comunicaciones.

El método de selección usado en nuestro algoritmo se basa en la utilización de unregistro de 8 bits que varía sus dos bits de menor peso según la selección optada en lapantalla de configuración del sistema. Posteriormente, se considera el bit referente alpuerto a utilizar y se cargan unas variables globales que describen el vector que detalla ladirección donde se encontrará la nueva subrutina y la base de memoria donde se encuentrala uart seleccionada.

Page 27: Comunicación de dos ordenadores mediante el …deeea.urv.cat/public/PROPOSTES/pub/pdf/517pub.pdf · sistema de comunicaciones es captar señales digitales y modularlas para la emisión

4. DESCRIPCIÓN DE LA SOLUCION ADOPTADA Comunicación de dos ordenadores con protocolo x-módem

25

Configuración de la UART.

La longitud de la palabra de datos será de 8 bits. Aunque nos dispongamos a realizarla transmisión de caracteres ASCII básico (7 bits), debemos transmitir 8 bits puesto que elbit de mayor peso selecciona justamente una tabla ASCII u otra (7 o 8 bits).Particularmente, en nuestro proyecto ese octavo bit siempre estará en estado lógico ‘0’.

Se tendrá 1 bit de paro con el propósito de conseguir la máxima velocidad detransmisión desde la UART al módem.

No existirá bit de paridad. Puesto que no controlaremos el error debido a paridad yaque en caso de errata en el byte transmitido, se detectará mediante el método del Checksumuna vez se disponga de todo un bloque recibido.

La velocidad de transmisión inicialmente deberá ser del mínimo posible puesto quese desconoce la velocidad del módem conectado. Posteriormente, tras conocer esacaracterística del módem, se efectuará el cambio de velocidad. El motivo de esta maniobraes el desconocimiento de la velocidad máxima del módem y la necesidad de transmitircomandos antes de conocer su máxima velocidad.

La configuración de la velocidad de transmisión de la UART puede venir dada pordos caminos diferentes: de forma manual y de forma automática.

La selección de velocidad en forma manual no supone ningún problema puesto quese trata de preguntar al usuario qué velocidad de transmisión desea y simplemente debecontrolar que el valor introducido sea permitido por el módem (el módem acepta unasvelocidades estándar).

Por otro lado, la selección de velocidad de forma automática presenta unaproblemática importante: no todos los módem disponen de la opción de selección develocidad del módem (comandos ATBi). Eso provoca que se tenga que controlar laposibilidad de configuración del módem mediante sus códigos de respuesta.

if ((selection&0x01)==0){B_UART=0x03F8; /* @ base UART memoria E/S (com1)*/ VECT_LS=0x0C; /* @ de @subrutina at int (com1)*/ escribe_mensaje(INI_SCR_SETUP_x,&yw,INI_SCR_SETUP_y,FIN_LINE_SE,

"Puerto seleccionado COM 1...");}

else{B_UART=0x02F8; /* @ base UART memoria E/S (com2)*/ VECT_LS=0x0B; /* @ de @subrutina at int (com2)*/ escribe_mensaje(INI_SCR_SETUP_x,&yw,INI_SCR_SETUP_y,FIN_LINE_SE,

"Puerto seleccionado COM 2...");}oldhandler_ls=getvect(VECT_LS); /* Almacen direcantigua subrutina*/setvect(VECT_LS,uart); /* Asignacion direc nueva subrutina*/

Page 28: Comunicación de dos ordenadores mediante el …deeea.urv.cat/public/PROPOSTES/pub/pdf/517pub.pdf · sistema de comunicaciones es captar señales digitales y modularlas para la emisión

4. DESCRIPCIÓN DE LA SOLUCION ADOPTADA Comunicación de dos ordenadores con protocolo x-módem

26

Inicialización del módem

Este proceso ubica el estado actual del módem a un estado apto para realizar laconexión con otro remoto. Después de otras aplicaciones, es probable que el módem seencuentre en un estado no deseado en nuestro programa. Como por ejemplo encontrarse enmodo de autorespuesta de llamadas sin haberlo indicado o conteniendo registros cargadoscon valores no deseados. La secuencia de comandos utilizada en este paso del proceso es elsiguiente: AT&F0V0S0=0S9=20S7=9.

Los caracteres AT servirán para reclamar la atención del módem indicando laemisión de un comando.

La cadena de caracteres &F0 constituyen un comando extendido que reconfigura elmódem cargando la primera configuración predeterminada, es decir, la que viene pordefecto de fábrica. De este modo se asegura el control de flujo por hardware entre otrascosas.

El comando V0 toma gran importancia para una buena ejecución del programapuesto que configura el módem para que suministre los códigos de resultado en formato decaracteres numéricos. En diferentes lugares del algoritmo existe la lectura de esos códigospara conocer si la ejecución de determinados comandos a sido válida o no. Si no se realizaeste comando, la ejecución del programa no será correcta.

El registro S0 indica el número de tonos de llamada entrante antes de establecerconexión con el sistema emisor. Por ende, la forma de anular la autorespuesta del módem

if ((selection&0x02)==0){/* Si seleccion de velocidad AUTOMATICO*/ escribe_mensaje(INI_SCR_SETUP_x,&yw,INI_SCR_SETUP_y,FIN_LINE_SE,

"AUTOAJUSTE DE VELOCIDAD DEL SISTEMA..."); sm=get_speed_auto(); /* Obtiene Divisor para maxima velocidad

Baud Rate = (Frecuency Input)/(16*Divisor)*/if (sm==-1) /* Caso no deteccion velocidad*/

{escribe_mensaje(INI_SCR_SETUP_x,&yw,INI_SCR_SETUP_y, FIN_LINE_SE, "ERROR... SELECCION MANUAL.");

selection=selection|0x02; /* Seleccion MANUAL*/ pinta_circle(LIGHTGRAY,RED); /* Pinta seleccion MANUAL*/

}else

{escribe_mensaje(INI_SCR_SETUP_x,&yw,INI_SCR_SETUP_y,FIN_LINE_SE,"VELOCIDAD MAXIMA:");

gotoxy(INI_SCR_SETUP_x+19,yw); printf("%d baudios",115200/sm); /* Frecuency input=1843200Hz

(1843200/16=115200)*/ pausa_seg(2); /* Pausa 2 seg. para permitir al usuario ver info en pantalla*/

}}if ((selection&0x02)==0x02)

{/* Seleccion MANUAL de velocidad*/ sm=get_speed_manual(); /* Determina la velociadad de modem*/ escribe_mensaje(INI_SCR_SETUP_x,&yw,INI_SCR_SETUP_y,FIN_LINE_SE,

"Velocidad establecida.");}

ini_ls(sm); /* Inicializa linea serie a velocidad del modem*/

Page 29: Comunicación de dos ordenadores mediante el …deeea.urv.cat/public/PROPOSTES/pub/pdf/517pub.pdf · sistema de comunicaciones es captar señales digitales y modularlas para la emisión

4. DESCRIPCIÓN DE LA SOLUCION ADOPTADA Comunicación de dos ordenadores con protocolo x-módem

27

es cargando ese registro a 0, de modo que sea el usuario el que indique el momento deestablecer conexión mediante el comando de respuesta manual. Posteriormente, si interesaubicar el módem a un estado de autorespuesta, se ejecutará la función intconf_mod_auto_r(void), que carga el registro S0 = 1.

int ini_modem(void){/************************************************************************ Funcion que tiene la mision de iniciar el modem a un estado faborable para la conexion. Utilización de comandos Hayes (AT).*************************************************************************/data_trans=1; /* Para enviar el primer dato*/if (manda_dato('A')==-1) /* Emision de AT&F0V0S0=0S9=20S7=9*/

return(-1);if (manda_dato('T')==-1)

return(-1);if (manda_dato('&')==-1) /* &F0 -> Configura modem con opciones definidas en fabrica*/

return(-1);if (manda_dato('F')==-1)

return(-1);if (manda_dato('0')==-1)

return(-1);if (manda_dato('V')==-1) /* V0 -> Respuesta de los comandos en codigos numericos*/

return(-1);if (manda_dato('0')==-1)

return(-1);if (manda_dato('S')==-1) /* S0=0 -> Anula respuesta Automatica*/

return(-1);if (manda_dato('0')==-1)

return(-1);if (manda_dato('=')==-1)

return(-1);if (manda_dato('0')==-1)

return(-1);if (manda_dato('S')==-1) /* S9=20 -> Tiempo de respuesta al detectar portadora (2seg.)*/

return(-1);if (manda_dato('9')==-1)

return(-1);if (manda_dato('=')==-1)

return(-1);if (manda_dato('2')==-1)

return(-1);if (manda_dato('0')==-1)

return(-1);if (manda_dato('S')==-1) /* S7=9 -> Tiempo de espera de la portadora (9 seg.)*/

return(-1);if (manda_dato('7')==-1)

return(-1);if (manda_dato('=')==-1)

return(-1);if (manda_dato('9')==-1)

return(-1);if (manda_dato(CR)==-1) /* Emision de ENTER*/

return(-1);pausa_seg(2); /* Pausa de 2 seg para dar tiempo al MODEM*/if ((inportb(B_UART+6)&0x20)==0) /* Registro MSR[5] (DSR) ==1?*/

return(1);return(0);}

Page 30: Comunicación de dos ordenadores mediante el …deeea.urv.cat/public/PROPOSTES/pub/pdf/517pub.pdf · sistema de comunicaciones es captar señales digitales y modularlas para la emisión

4. DESCRIPCIÓN DE LA SOLUCION ADOPTADA Comunicación de dos ordenadores con protocolo x-módem

28

4.1.2. PROCESO 2: ESTABLECIMIENTO DE CONEXIÓN ENTRE MÓDEMS

En este proceso se pretende efectuar la conexión entre los módems distantes a unavelocidad determinada y mediante unos protocolos de compresión y de detección de errornegociado ente ellos.

Primeramente se debe establecer el módem que origina la llamada y el que la recibe.En el algoritmo se han definido las funciones int marca_tel(char nt[15]) y intresp_llam(void).

La función que realiza la marcación de un número de teléfono inicialmente realiza unreset del módem situándolo al estado configurado en fábrica. Posteriormente se configurapara que suministre el código de resultados según el desarrollo de la conexión. Esta opciónno será utilizada en nuestro programa puesto que realiza internamente la detección decomunicación establecida mediante una petición de interrupción por parte de la UART.Así, esta opción se introduce para el caso en que se quiera utilizar esta función en algúnproyecto futuro independientemente del resto de funciones.

Tras la marcación del valor telefónico, el sistema espera a que se informe que se haestablecido comunicación mediante la variable global modem_conect. Esta variable cambiade estado en la rutina de atención a la interrupción de la UART cuando se detecta la señalportadora:

Para establecer la conexión entre sistemas, distinguimos la opción de efectuar larespuesta de la llamada de forma automática o de forma manual. La primera es útil ensistemas donde se carece de un usuario en el sistema receptor.

Debido al formato del protocolo X-MODEM, se obliga a configurar el sistemareceptor de la llamada como el sistema transmisor de datos. Recordando la forma de esteprotocolo, el sistema transmisor de datos permanece en continua espera de un carácterNAK que informe de que el sistema receptor se encuentra preparado. Por tanto, una vezestablecida la configuración en modo autorespuesta, se inhibe el contador TimeOut parasuministrar todo el tiempo necesario al sistema generador de la llamada y evitar errores porexceso de tiempo en espera.

identif=inportb(B_UART+2); /* Lectura IIR (Interrupt Indentification Reg.)*/switch(identif&0x06) /* Observacion de bits 1 – 2*/

{case 2:{// THR vacio (THRE) data_trans=1; /* Indica dato transmitido*/ break;}

case 4:{// RBR lleno data_recep=1; /* Indica dato recibido*/ break;}

case 0:{// MODEM STATUS m_status=inportb(B_UART+6); /* Lectura MSR (Modem Status Reg.)*/ if (m_status&0x80)

modem_conect=1; /* DCD --> Portadora detectada*/ else

{modem_conect=0; /* Informa perdida de portadora*/ painted=0;} /* Informa dibujar entorno (conf.)*/

break;}

Page 31: Comunicación de dos ordenadores mediante el …deeea.urv.cat/public/PROPOSTES/pub/pdf/517pub.pdf · sistema de comunicaciones es captar señales digitales y modularlas para la emisión

4. DESCRIPCIÓN DE LA SOLUCION ADOPTADA Comunicación de dos ordenadores con protocolo x-módem

29

Podemos describir el este proceso de la siguiente forma:

Proceso de conexión entre MODEM

Determinación sistemagenerador o contestador

de llamada

Detección de llamaday repuesta.

Espera y recepción de portadora

Detección de escenariode comunicaciones

correcto

Generador Constestador

Detección de tono delínea y marcación

de un numero de teléfono.

Envio de portadora

Negociación ydeterminación de

velocidad y protocolo

Paso a proceso de Transmisión / Recepción

de datos

Figura 8. Diagrama de estados en el proceso de conexión entre módems.

Determinación de sistema generador o contestador de llamada

Este paso implicará una bifurcación en el algoritmo puesto que depende de la opciónescogida, dispondremos de un sistema generador o contestador de llamada. La selección deuna opción condicionará las tramitaciones pertinentes para el buen desarrollo de laconexión.

Page 32: Comunicación de dos ordenadores mediante el …deeea.urv.cat/public/PROPOSTES/pub/pdf/517pub.pdf · sistema de comunicaciones es captar señales digitales y modularlas para la emisión

4. DESCRIPCIÓN DE LA SOLUCION ADOPTADA Comunicación de dos ordenadores con protocolo x-módem

30

Detección de tono de línea y marcación de un número de teléfono

Se procesará este paso en caso de que se indique el deseo explícito por parte delusuario de realizar la llamada.

Inicialmente se enviará la siguiente secuencia de comandos: ATZ0X4. El objetivo deesta primera secuencia de comandos es realizar una reinicialización del módem con laconfiguración almacenada en el perfil número 1 y configurarlo para que realice lamarcación del número detectando la ocupación de línea y esperando el tono de invitación amarcar.

Seguidamente activa una temporización de 2 segundos para suministrar el tiemponecesario al módem para interpretar los comandos y actuar en consecuencia.

Posteriormente se ha añadido la secuencia de comandos siguiente: ATDT[num. Tel.].Esta cadena de comandos realizará el discado del número de teléfono indicadoseguidamente mediante la marcación de tonos.

Espera y recepción de portadora

Justo después de realizar la marcación del número de teléfono el sistema debeubicarse en situación de espera hasta la recepción de la señal portadora.

Este problema se solventa introduciendo una condición en un bucle reiterante dedonde no se sale hasta que realmente se haya detectado esa portadora. El módem informaen el registro de estado MSR de la detección de esa señal mediante el bit 7 (DCD). Así, elsistema se ha configurado para que solicite la atención a interrupción debido a un cambiode estado del módem. En la rutina de atención a interrupción se encuesta ese bit, que encaso de valer un ‘1’ lógico, actuará sobre una variable global para permitir la salida delbucle en que se encuentra la función. Por otro lado, la salida de ese bucle se efectuará si seha esperado a que se establezca la conexión durante más de 25 segundos. Así, liberará lalínea e informará del error.

Detección de llamada y respuesta. Envío de portadora.

A medida que se ha ido avanzando en la realización de este documento, se hainformado de la posibilidad de permitir dos modos de respuesta: respuesta manual yrespuesta automática. La primera consiste en realizar la emisión al módem de la línea decomando siguiente: ATA. El módem inicia un proceso de emisión de la señal portadorapara comunicarse con el módem o el sistema que originó la llamada. La segunda tiene lacomplejidad de que debe detectar esa llamada entrante y responder de forma automáticasin la actuación de ninguna ayuda externa. El módem realiza la detección de la llamada

while ((!modem_conect)&&(!timeout)); /* Espera hasta conectar*/if (timeout==1) /* Si pasa 25 seg sin conectar*/

{paint_message("Error de conexion..."); colgar_modem(); pausa_seg(2); /* Da tiempo observar mensaje screen*/ return(-1);}

paint_message("CONEXION ESTABLECIDA...");pausa_seg(2); /* Tiempo que permite a los */return(0); /* modem establecer comunicación*/

Page 33: Comunicación de dos ordenadores mediante el …deeea.urv.cat/public/PROPOSTES/pub/pdf/517pub.pdf · sistema de comunicaciones es captar señales digitales y modularlas para la emisión

4. DESCRIPCIÓN DE LA SOLUCION ADOPTADA Comunicación de dos ordenadores con protocolo x-módem

31

entrante de forma automática. Por ende, la misión de nuestro algoritmo, saciando el deseopor parte del usuario de establecer la comunicación de forma automática, es configurar elmódem para su debida actuación.

La forma de configurar ese modo de respuesta automática es cargando el registro S0a un valor diferente de 0. En este registro figura el número de tonos de llamada que debenproceder antes de descolgar y proceder al envío de la señal portadora. Así, en nuestroproyecto, se ha particularizado ese valor a un solo tono de llamada cuando se desea estemodo de respuesta.

Negociación y determinación de velocidad y protocolos

Este proceso de negociación entre los módems tiene la misión de establecer lavelocidad de transmisión y los protocolos de error y compresión. El módem, por ser undispositivo pseudo-inteligente, realiza la negociación de forma automática tras lacontestación de la llamada desde el sistema receptor. En el momento que finaliza lanegociación de forma correcta, cada módem activa la señal DCD (Detección de portadora).Tras la detección de esa señal, se procede al siguiente paso.

Detección de escenario de comunicaciones correcto

Tras la recepción de la señal portadora y con la determinación de la velocidad detransmisión y los protocolos de compresión y error, se debe asegurar que ese escenario decomunicaciones es correcto y leal para la transmisión de datos. Así, tras detectar que el bitDCD se activa informando de que la conexión se ha establecido, realizamos unatemporización de 2 segundos antes de dar por finalizada la conexión entre módems. Eseintervalo de tiempo garantizará la conexión suministrando un intervalo de tiempo a cadamódem para estabilizar su conexión..

4.1.3. PROCESO 3: TRANSMISIÓN / RECEPCIÓN DE DATOS

4.1.3.1. Transmisión de datos

El protocolo X-MODEM anuncia la utilización de bloques en su definición. Porende, el primer problema a solventar en la transmisión de datos es la correcta generaciónde esos bloques para su posterior tratamiento.

Podemos tener varias aplicaciones del sistema para la emisión y recepción de datos,pero en el presente proyecto se ha particularizado a la transmisión de datos de un ficheroespecificado residente en el disco duro del ordenador. Cabe notar que esto es unaaplicación de entre otras posibles, por lo que las funciones realizadas en el proyectopueden ser de gran ayuda en aplicaciones como comunicación de datos de un sistemaremoto que dispone de una serie de dispositivos de medida a un ordenador central, larealización de un chat, etc.

El proceso de transmisión de datos se puede resumir en la realización de cuatrotareas: definición de fichero a transmitir, creación de bloques de datos, transmisión de losbloques y confirmación de la transmisión realizada correctamente.

Page 34: Comunicación de dos ordenadores mediante el …deeea.urv.cat/public/PROPOSTES/pub/pdf/517pub.pdf · sistema de comunicaciones es captar señales digitales y modularlas para la emisión

4. DESCRIPCIÓN DE LA SOLUCION ADOPTADA Comunicación de dos ordenadores con protocolo x-módem

32

Seguidamente se presenta un organigrama lógico del proceso de transmisión dedatos:

Proceso de Transmisión de DatosDeterminación del fichero

a transmitirReconocimiento del

fichero declarado

Transmisión de bloque n

Generación del bloque n

Paso a proceso deRecepción de datos

Existefichero?

NO

SI

Trans.correcta?

NO SI Últimobloque?

NO

Bloque n = Bloque n +1

SI

Emisión de EOTTrans.másficheros?

Paso a proceso decierre de conexión

Recibir fichero?

NO

SI

NO

SI

Figura 9. Diagrama de estados en el proceso de Transmisión de datos.

La tarea de definición del nombre del fichero a transmitir toma gran importanciapuesto que de ella depende la transmisión del registro deseado. Inicialmente se introduce elnombre del fichero existente en el disco duro que se desea transmitir, se realiza unaoperación de apertura del fichero como lectura de caracteres para informar la existencia deese fichero. En caso de que no exista, se informa al sistema y se da la oportunidad dedefinir de nuevo el nombre correcto del fichero. El sistema permanecerá reiterando estatarea de reconocimiento hasta que el fichero sea uno existente en memoria.

La posterior tarea del sistema es la definida por la creación, transmisión de bloque yconfirmación de correcta transmisión. Se convierte en una reiteración de generación debloques y transmisión puesto que se generan nuevos bloques una vez se conoce el estado

Page 35: Comunicación de dos ordenadores mediante el …deeea.urv.cat/public/PROPOSTES/pub/pdf/517pub.pdf · sistema de comunicaciones es captar señales digitales y modularlas para la emisión

4. DESCRIPCIÓN DE LA SOLUCION ADOPTADA Comunicación de dos ordenadores con protocolo x-módem

33

de la correcta transmisión realizada del bloque anterior. Así, si el sistema receptor informade que se realizó una transmisión incorrecta, se volverá a realizar la tarea de transmisióndel bloque hasta que se informe de la correcta situación. Cuando esto último ocurre, segenera nuevo bloque si existen más datos en el fichero a transmitir, sino, se cierra elfichero fuente y se informa al sistema receptor del deseo de finalizar la transmisión debidoa que el fichero ya se ha enviado en su totalidad.

Finalmente se indica el deseo, expreso por usuario, de realizar otra transmisión orecepción de un fichero. En caso de no desear ninguna de estas dos opciones, el sistemapasa al proceso de cierre de conexión.

while ((end!=2)&&(nie<10)&&(modem_conect)){/* Entra si existe conexion y menos de 10 errores de transmision*/ answer=manda_block(string); /* Envia bloque*/ switch(answer)

{case ACK:{/* Caso bloque bien enviado*/ nie=0; /* Reset contador errores*/ escribe_mensaje(INI_SCR_SR_x,&ssy,INI_SCR_SR_y,FIN_LINE_SR,

"Bloque enviado numero:"); gotoxy(INI_SCR_SR_x+23,ssy); printf("%d",string[1]); aux_block=aux_block+1; nbck=nbck+1; /* Crea nuevo bloque*/ if (nbck==256)

nbck=0; bar(B_PRSx,B_PRSy,B_PRSx+W_PRS,

(B_PRSy+(H_PRS*aux_block/ntblck))); if (end)

end=2; /* Sale si no hay datos a enviar*/ else

end=make_block(string,nbck,f); /* Crea nuevo bloque*/ break;}

case NAK:{escribe_mensaje(INI_SCR_SR_x,&ssy,INI_SCR_SR_y,FIN_LINE_SR,"Dato mal enviado...");

nie++; /* Incrementa contador*/ break;}

case CAN:{escribe_mensaje(INI_SCR_SR_x,&ssy,INI_SCR_SR_y,FIN_LINE_SR,"Señal CAN recibido. ");

escribe_mensaje(INI_SCR_SR_x,&ssy,INI_SCR_SR_y,FIN_LINE_SR,"Cancelando transmision...");

return(-1); /* Indica error*/ }

}}

Page 36: Comunicación de dos ordenadores mediante el …deeea.urv.cat/public/PROPOSTES/pub/pdf/517pub.pdf · sistema de comunicaciones es captar señales digitales y modularlas para la emisión

4. DESCRIPCIÓN DE LA SOLUCION ADOPTADA Comunicación de dos ordenadores con protocolo x-módem

34

La emisión de un bloque de datos se realiza mediante la función charmanda_block(unsigned char dato). Además de efectuar la transmisión de un bloque, esafunción devuelve un dato de control emitido por el sistema remoto indicando el resultadode la transmisión de aquel bloque. De esa modo se consigue una mayor compacidad en elalgoritmo evitando recargar la función de emisión de fichero.

La transmisión de cada carácter se realiza mediante la función intmanda_dato(unsigned char DATO). Esta función se convierte en la barrera entre la capa deenlace y la capa física definidas según el modelo OSI, puesto que negocia la emisión de uncarácter con la UART mediante las líneas físicas CTS y RTS. No cargará el registro dedatos de la UART (THR) hasta que la señal CTS indique que el módem se encuentrapreparado para recibir el dato desde la UART.

data_trans=1; /* Para enviar primer byte*/for (ind=0;ind<=131;ind++)

{end_sb=manda_dato(block[ind]); /* Envia bloque*/ if (end_sb==-1)

return(CAN); /* CANcel en caso error*/}

data_recep=0; /* Indica RBR vacio*/end_sb=recibe_dato(&respuesta); /* Obtiene dato de receptor*/if (end_sb==-1) return(CAN); /* CANcel en caso de error*/else return(respuesta); /* Respuesta es ACK,NAK o CAN*/

control=inportb(B_UART+6); /* Lectura MSR (Modem Status Register)*/reset_timer(); /* Reset contador timer*/if ((control&0x10)==0) /* Si no detecta CTS (Clear To Send)*/

outportb(B_UART+4,inportb(B_UART+4)|0x02); /* Aserta RTS*/while ((control&0x10==0)&&(timeout==0)) /* Espera CTS o TimeOut ON*/

control=inportb(B_UART+6);while ((data_trans!=1)&&(timeout==0)); /* Espera a que THR este vacio o TimeOut ON*/if (timeout==1)

return(-1); /* Salida con error*/else

outportb(B_UART,DATO); /* Manda dato a THR (Transmitter Holding Reg)*/data_trans=0; /* Indica Registro cargado*/return(0); /* Salida sin error*/

Page 37: Comunicación de dos ordenadores mediante el …deeea.urv.cat/public/PROPOSTES/pub/pdf/517pub.pdf · sistema de comunicaciones es captar señales digitales y modularlas para la emisión

4. DESCRIPCIÓN DE LA SOLUCION ADOPTADA Comunicación de dos ordenadores con protocolo x-módem

35

4.1.3.2. Recepción de datos

De la misma forma que ocurría en el proceso de transmisión de bloques, el procesode recepción de datos se lleva a cabo gracias a la ejecución de diversas tareas ligadas por elproceso. Es decir, en este proceso se puede distinguir las siguientes tareas: definición delfichero a recibir, recepción de bloques y utilización de herramientas de detección de errordefinidas por el protocolo X-MODEM e informar al emisor sobre el correcto recibimientodel bloque.

En la primera tarea en la recepción de datos es evidente, determinar la ubicacióndonde se almacenará la información recibida. Esta tarea es fácilmente realizable por lautilización de un lenguaje que permite realizar la apertura de ficheros en modo escritura.Esa facilidad de creación de ficheros como escritura suministra el inconveniente deposibilitar el borrado de un fichero existente sin previo aviso. Por ese motivo siempre sedeberá suministrar el nombre de un fichero que no exista si no se quiere perderinformación, o también es útil declarar una carpeta exclusivamente para la recepción dedatos mediante este programa.

Seguidamente se presenta un organigrama lógico del proceso de recepción de datos:

Proceso de Recepción de Datos

Determinación del fichero a recibir

Transmisión ACK

Recepciónbloque n

Dato=CAN?

Recep.correcta?

SI

Bloque n = Bloque n +1

Paso a proceso decierre de conexión

SI

Emisión NAKIndica receptor ready

Recibe datoSOH, EOT o CAN

Dato=EOT?

NO

Transmisión ACK

Transficheros?

Recibir fichero? NO

SI

SI

Paso a proceso deTransmisión de datos

Transmisión NAK

NO

NO

NO

SI

Figura 10. Diagrama de estados en el proceso de Recepción de datos.

Page 38: Comunicación de dos ordenadores mediante el …deeea.urv.cat/public/PROPOSTES/pub/pdf/517pub.pdf · sistema de comunicaciones es captar señales digitales y modularlas para la emisión

4. DESCRIPCIÓN DE LA SOLUCION ADOPTADA Comunicación de dos ordenadores con protocolo x-módem

36

Una vez definido el nombre que titulará la información a recibir, la siguiente tareaconsiste en informar al sistema emisor de datos que el sistema receptor se encuentrapreparado para la recepción de datos. Posteriormente se somete a la recepción de unbloque. Una vez realizada la transferencia de un sistema a otro, se procede a la revisión delos datos con el propósito de detectar errores en la trama. Esta detección de errores serealiza mediante las técnicas que sugiere el protocolo X-MODEM:

Inicialmente, el sistema receptor debe asegurar que el número de bloque recibido esel que correspondiente. Para ese propósito existe en la trama de bytes enviado, uno queinforma sobre el número de bloque transmitido y otro que suministra ese valor en formanegada. Si este primer examen de transmisión de datos correctamente recibido lo supera,realiza el checksum de la trama de bytes recibida y la compara con un checksum realizadoy enviado por el sistema emisor. En caso que se cumpla las condiciones a las que sesometen los datos recibidos, el sistema receptor informa de la correcta transmisión delbloque, lo almacena y posteriormente se mantiene expectante para la recepción de otrobloque. Permanecerá actuando de esa forma hasta que perciba un carácter de cancelación(CAN) o de fin de transmisión (EOT).

while ((nie_r<=10)&&(result!=EOT)&&(result!=CAN)&&(modem_conect)) {/*Entra si existe conexión, menos de 10 errores de recepcion y no recibe señal de CAN o EOT*/ result=recep_block(registro,nbck_r); /* Recibe Bloque*/ switch(result)

{case ACK:{nie_r=0; /* Reset contador de errores*/ escribe_mensaje(INI_SCR_SR_x,&sr_y,INI_SCR_SR_y,FIN_LINE_SR,

"Bloque recibido numero:"); gotoxy(INI_SCR_SR_x+24,sr_y); printf("%d",registro[1]); data_trans=1; manda_dato(ACK); /* Indica transmision OK*/ setfillstyle(1,GREEN); /* Color de la barra de proceso*/

/* Pinta barra proceso segun estado actual*/ bar(B_PRSx,B_PRSy+H_PRS,B_PRSx+W_PRS,

B_PRSy+H_PRS-(H_PRS*aux_block_r)/ntbr); nbck_r++; if (nbck_r==256) nbck_r=0; aux_block_r++; for(index_r=3;index_r<=130;index_r++)

fprintf(f_r,"%c",registro[index_r]); /* Guarda bloque en fichero*/ break;}

case NAK:{nie_r++; /* Incrementa el contador de error*/ escribe_mensaje(INI_SCR_SR_x,&sr_y,INI_SCR_SR_y,FIN_LINE_SR,

"Error en los datos recibidos."); escribe_mensaje(INI_SCR_SR_x,&sr_y,INI_SCR_SR_y,FIN_LINE_SR,

"Reintento numero:"); gotoxy(INI_SCR_SR_x+19,sr_y); printf("%d",nie_r); data_trans=1; manda_dato(NAK); /* Informa al emisor error de trans*/ break;}

case EOT:{escribe_mensaje(INI_SCR_SR_x,&sr_y,INI_SCR_SR_y,FIN_LINE_SR,"Fichero recibido.");

data_trans=1; manda_dato(ACK); /* Indica EOT bien recibido*/ break;}

Page 39: Comunicación de dos ordenadores mediante el …deeea.urv.cat/public/PROPOSTES/pub/pdf/517pub.pdf · sistema de comunicaciones es captar señales digitales y modularlas para la emisión

4. DESCRIPCIÓN DE LA SOLUCION ADOPTADA Comunicación de dos ordenadores con protocolo x-módem

37

La recepción de un bloque de datos se realiza mediante la ejecución de la funciónchar recep_block(unsigned char block_r[132],int numb). Esta función realiza el control dela correcta recepción del bloque, controlando que se trate del número de bloque correcto yque el contenido que lo compone se ha transmitido correctamente mediante el checksum.

La recepción de un dato se realiza mediante la función int recibe_dato(unsignedchar *r_data). De la misma forma que ocurre en la función de recepción de datos, estafunción se convierte en la barrera entre la capa física y la capa de enlace que define elmodelo de comunicaciones OSI. Esta función se limita a controlar que el registro derecepción de la UART (RBR) se encuentra libre para poder escribir el nuevo dato recibido.

block_r[0]=' ';while ((block_r[0]!=SOH)&&(block_r[0]!=EOT)&&(endr==0))

endr=recibe_dato(&block_r[0]); /* Espera ACK o EOT*/if (endr==-1) /* Caso espera demasiado larga*/

return(CAN);if (block_r[0]==EOT) /* Caso finalizar transmision por fichero enviado*/

return(EOT);/* Si llega aqui, ha recibido SOH*/

if (recibe_dato(&block_r[1])==-1) /* Espera recepcion de numero bloque*/return(CAN); /* Caso no recibir nada,cancela transmision*/

if (block_r[1]!=numb) /* Confirma numero bloque correcto*/return(NAK); /* Si no lo es, informa deseo reenvio*/

if (recibe_dato(&block_r[2])==-1) /* Espera recepcion de numero de bloque en Ca1*/return(CAN); /* Caso no recibir nada cancela transmision*/

if (block_r[2]!=(0xFF-numb)) /* Confirma numero bloque en Ca1 OK*/ return(NAK); /* Si no lo es, informa deseo reenvio*/

for (ind_regr=3;ind_regr<132;ind_regr++) /* Recibe 128 Octetos de datos*/if (recibe_dato(&block_r[ind_regr])==-1)

return(CAN); /* Si no recibe dato en 25 s, cancela transmision*/if (chk_sum(block_r)!=block_r[131]) /* Observa si los datos recibidos son correctos*/

return(NAK);return(ACK); /* Informa bloque recibido correcto*/

case CAN:{escribe_mensaje(INI_SCR_SR_x,&sr_y,INI_SCR_SR_y,FIN_LINE_SR,"Activacion de TimeOut...”);

data_trans=1; manda_dato(CAN); /* Desea CANcelar transmision*/ break;}

}}

while ((data_recep!=1)&&(timeout==0)); /* Espera RBR vacio (Receiver Buffer Register)*/if (timeout==1)

return(-1);*r_data=inportb(B_UART); /* Capta Byte del registro RBR*/data_recep=0; /* Indica RBR esta cargado*/

return(0);

Page 40: Comunicación de dos ordenadores mediante el …deeea.urv.cat/public/PROPOSTES/pub/pdf/517pub.pdf · sistema de comunicaciones es captar señales digitales y modularlas para la emisión

4. DESCRIPCIÓN DE LA SOLUCION ADOPTADA Comunicación de dos ordenadores con protocolo x-módem

38

4.1.4. PROCESO 4: CIERRE DE CONEXIÓN

Después de haber realizado todo el trasiego de información entre los sistemascomunicados, se debe proceder a la finalización de esa conexión que ha permitido lacomunicación con el propósito de liberar la línea telefónica y poder realizar otras tareas.

La manera de proceder es la siguiente: teniendo en cuenta que la señal DTR (bit 0 delregistro MCR) informa sobre el estado en que se encuentra el DTE al módem y que esimprescindible que se encuentre en estado activo para mantener la comunicación, en elmomento en que se desea cortar la conexión se sitúa esa señal a estado inactivo lo cualprovocará un corte en la conexión de forma inmediata.

4.1.5. PROCESO 5: RETORNO A LA ANTIGUA CONFIGURACIÓN

El último de los procesos se dedicará a reestablecer el sistema con el propósito de nodesestabilizar el sistema cuando nuestro programa finalice y el sistema operativo tenga quehacer uso de los periféricos utilizados.

El único dispositivo que se somete a una reconfiguración para funcionar acorde a losrequerimentos de nuestro programa, es la UART. En este proceso de finalización delsistema este dispositivo se deja en el estado de configuración utilizado puesto que losprogramas que utilizan uno de los puertos serie, lo configura acorde a sus necesidades.

Si nos remontamos al proceso inicial, podemos recordar que se estableció elalmacenaje de las direcciones donde se apunta a la antigua subrutina de atención a lainterrupción reclamada por el dispositivo determinado. En este proceso nos limitamos arecargar esas direcciones en la tabla de los vectores de interrupción que fueron cambiados.

Page 41: Comunicación de dos ordenadores mediante el …deeea.urv.cat/public/PROPOSTES/pub/pdf/517pub.pdf · sistema de comunicaciones es captar señales digitales y modularlas para la emisión

4. DESCRIPCIÓN DE LA SOLUCION ADOPTADA Comunicación de dos ordenadores con protocolo x-módem

39

4.2. DESCRIPCIÓN DEL ALGORITMO DEL PROGRAMA

El propósito de este apartado es suministrar información sobre la estructura quesigue el entorno de usuario realizado para facilitar el manejo de las transmisiones deficheros.

4.2.1. El entorno del programa

El entorno del programa tiene el objetivo de facilitar la manipulación de lasdiferentes variables de control y de datos necesarias para realizar la comunicación de datosentre dos sistemas. Su formato viene establecido por el contenido de los enunciados quecontienen y por los diferentes dibujos que sirven para diferenciar las diferentes áreasexistentes en una misma ventana.

En el entorno del programa podemos diferenciar cuatro ventanas o páginas, lascuales se anuncian como Entorno de Configuración, Transmisión de Datos y Recepción deDatos. Además de estas tres páginas, también cabe destacar la existencia de una barra detareas ubicada en la zona inferior de la pantalla.

Para facilitar la programación, se ha realizado la declaración de dos nuevos tiposestructurados denominados tipo palabra y tipo defmenu. El primer tipo reúne los camposnecesarios para definir un enunciado con su situación en las coordenadas x-y que definenel plano donde se dibuja sobre la pantalla del monitor. El segundo tipo contiene los campospertinentes para definir hasta siete enunciados con sus respectivas situaciones, queanunciarán una determinada variable dentro de esa página, y la información pertinentesobre el titulo de la página en la barra de tareas y su correspondiente ubicación en el planode la pantalla. Tras la definición de esos nuevos tipos estructurados, los enunciadosexistentes en cada página o entorno vendrán definidos por el valor de un registro de tresceldas de tipo defmenu, una para cada página existente. De esta forma se consigue unacompacidad muy útil puesto que se tiene en una sola variable el contenido de todos losenunciados existentes en el entorno con su respectiva ubicación. Mediante la utilización dela función void carga_menu(defmenu menu1[3]), se consigue realizar la carga de todosesos enunciados y explicitando su ubicación determinada. Interno en esta función,mediante el uso de las funciones strcpy() definidas en la librería string.h, se realiza la cargade los diferentes registros internos en la variable menu1.

Respecto el formato de los dibujos existentes en cada página determinada, se hadefinido la función void pinta_entorno(int num_entorn). Esta función realiza el trazado delos dibujos del entorno o página definido por la variable de entrada num_entorn. Así, estavariable puede adquirir cuatro valores: -1, si se desea dibujar la barra de tareas inferior; 0,si se desea dibujar el formato de la página Entorno de Configuración; 1, si se desea dibujarla página Transmisión de Datos; y 2, si se desea dibujar la página Recepción de Datos.

Debido a la existencia de diversas páginas en el entorno del programa, se dispone detres variables que permitirán viajar entre ellas y dentro de cada una. Estas variables songlobales puesto que se precisan para variar su estado en la rutina de atención a interrupciónpor teclado. Las variables son las siguiente: opcion, establecerá en todo momento elentorno donde se encuentra navegando el usuario; intro, que indicará el deseo por parte delusuario de introducirse en una página determinada; y la variable painted, que servirá de

Page 42: Comunicación de dos ordenadores mediante el …deeea.urv.cat/public/PROPOSTES/pub/pdf/517pub.pdf · sistema de comunicaciones es captar señales digitales y modularlas para la emisión

4. DESCRIPCIÓN DE LA SOLUCION ADOPTADA Comunicación de dos ordenadores con protocolo x-módem

40

control para redibujar el entorno donde se encuentre el usuario para el caso en que existauna nueva selección de alguna opción.

El acceso a las diferentes páginas del entorno se realiza mediante la selección deunos enunciados u otros en la barra de tareas inferior. Para indicar que se ha introducido enel interior de una página determinada, el cuadro amarillo de selección presente en la barratoma el color rojo. Para realizar el dibujo de ese cuadro de color amarillo o color rojo sedispone de la función void pinta_cuadro(int c_x,int c_y,char name[18],int select). A estafunción se le pasa las coordenadas x-y donde se situará el cuadro, el título que se escribiráuna vez se superponga el cuadro al antiguo texto y el color del cuadro mediante la variableselect, que si se sitúa a valor 0, se pintará de color amarillo; y si se sitúa a 1, se pintará decolor rojo.

En determinadas zonas del algoritmo se realiza encuestas para conocer lasintenciones del usuario. Con el propósito de mantener las correspondientes pausas cuandose efectúa la encuesta y asegurar la ruta de ejecuciones de la funciones mientras seencuentra en ese proceso, la variable intro toma valores negativos y no cambia hasta que seefectúa una determinada acción obligatoria. Para visualizar este método de encuesta, nopodemos referir al momento en que el sistema requiere el conocimiento de si se deseaefectuar una llamada o una respuesta para establecer conexión. En este caso, inicialmentese realiza la pregunta al usuario y se sitúa la variable intro a –1. Una vez se presiona latecla determinada (en este caso sería [M] Marcar o [R] Responder), la subrutina sitúa introa un valor determinado según la opción escogida. Si suponemos que se presiona [M], estavariable se situaría a un valor –2. De esta forma se establece una determinada acción segúnlas intenciones del usuario. No hay que olvidar que el objetivo de la variable intro tambiénes marcar el nivel donde se encuentra dentro de una página, y por tanto, una vez finalizadala encuesta, se debe cargar al valor que tenía en un momento determinado.

4.2.2. Programa principal

El programa principal se convierte en la parte del algoritmo de donde parten lasdiferente bifurcaciones hacia una página u otra seleccionada por el usuario.

Inicialmente se establece la inicialización de la tarjeta de video, el teclado y el relojdel DTE. Posteriormente se realiza la carga de la variable menu0, que contiene toda lainformación relativa a los enunciados que figuran en el entorno del programa.

Tras la realización de estas inicializaciones, el programa obliga a configurar laUART seleccionada y el módem para poder efectuar la pertinente comunicación. Así, nopermite navegar hacia otras páginas del entorno hasta que se ha establecido comunicación,puesto que los procesos (comentados en el apartado 4 Descripción de la soluciónadoptada) se deben efectuar de forma ordenada unos tras otro. Tampoco se debe permitircambiar la configuración del sistema una vez se ha establecido la comunicación entre losdos sistemas. Para llevar a cabo esta proposición de seguridad para evitar problemas en lacomunicación, se ha introducido un condicionante antes del acceso a un determinadapágina del entorno con la variable modem_conect, que informa del estado actual de laconexión. Existe una excepción cuando se configura el módem en modo autorespuesta,puesto que el entorno se sitúa en la página de Transmisión de datos a la espera de lallamada entrante para responder y ponerse en situación de escucha de la señal NAK,emitida por el sistema receptor, que indica que se puede iniciar la transmisión de datos.

Page 43: Comunicación de dos ordenadores mediante el …deeea.urv.cat/public/PROPOSTES/pub/pdf/517pub.pdf · sistema de comunicaciones es captar señales digitales y modularlas para la emisión

4. DESCRIPCIÓN DE LA SOLUCION ADOPTADA Comunicación de dos ordenadores con protocolo x-módem

41

El acceso a una página viene representada por las funciones void win_setup(defmenumenu3[3]) (representa a Entorno de Configuración), int win_send_file(defmenu menu4[3])(representa a Transmisión de Datos), void win_rece_file(defmenu menu5[3])(representa aRecepción de Datos).

Una vez establecido el entorno donde se quiere introducir, el programa principalejecuta una de esas tres funciones. Tiene en cuenta el estado de la conexión y el valor de lavariable global opcion, que es la que indica las intenciones del usuario de ir a una página uotra.

Si se produce la desconexión de la línea en un momento determinado, se informa alusuario del problema y ubica el entorno en la página de configuración para permitirrealizar el proceso de conexión. La detección de esa desconexión se realiza gracias a que seconfigura la UART para que realice peticiones de interrupción debido a cambios de estadoen el módem. Así, realizando la encuesta al registro MSR se conoce si existe conexión ono.

El programa principal se encarga de finalizar el sistema redireccionando las antiguassubrutinas de atención a interrupción de los dispositivos utilizados y finalizando la tarjetade video.

4.2.3. Entorno de Configuración

El acceso a este entorno se realiza mediante la ejecución de la función voidwin_setup(defmenu menu3[3]). A ésta se le pasa una variable que contiene todo elcontenido relativo a los enunciados y sus ubicaciones que establecen el formato delentorno. Esa variable es necesaria para poder escribir los diferentes campos presentes enesta página.

Inicialmente se dibuja el formato del entorno mediante las funciones voidpinta_entorno(int num_entorn) y void pinta_menu(defmenu menu2[4],int num_menu) yadescritas anteriormente. El cuadro de selección de la barra de tareas permancerá de coloramarillo hasta la presión de la tecla ENTER, que indicará el deseo de efectuar cambios enla configuración. En ese instante, la variable intro toma valor ‘1’ para indicar que elprograma se encuentra en un nivel superior de acceso.

La selección de la configuración se informa mediante unos círculos coloreados de undeterminado color que indica si está en disposición de cambiar su selección (coloramarillo), o se encuentra seleccionado pero sin posibilidad de cambiar selección hasta quese presione ENTER (color rojo) o imposibilidad de cambiar hasta que no se reinicialice lapágina (color gris). Estos círculos se dibujan mediante la función void pinta_circle(intcolor_A, int color_B). El color A hace referencia al color del círculo seleccionado de la filasuperior y el color B al del seleccionado en la fila inferior. El acceso a una fila u otra serealiza según el valor de intro, que marca el nivel en que se encuentra dentro de la página.

La selección de los círculos determinados, marca el valor del registro selection,variable global que varía su contenido según las teclas presionadas en el nivel que marcaintro en la rutina de atención a interrupción de teclado.

Dependiendo del contenido de ese registro, se seleccionará un puerto serie u otro.Eso comporta que se seleccione un vector de interrupción u otro y una base de memoriadonde se encuentra los contenidos de los registros de la UART. Tras efectuar esa selección,

Page 44: Comunicación de dos ordenadores mediante el …deeea.urv.cat/public/PROPOSTES/pub/pdf/517pub.pdf · sistema de comunicaciones es captar señales digitales y modularlas para la emisión

4. DESCRIPCIÓN DE LA SOLUCION ADOPTADA Comunicación de dos ordenadores con protocolo x-módem

42

se reestablece la dirección de la nueva subrutina de atención a interrupción de UART en elvector de interrupciones y se dispone a realizar la tarea de inicialización del módem.

Inicialmente, la velocidad de transmisión de la UART se configura a la mínimaposible (1200 baudios) para evitar problemas con módems anticuados y lentos.Posteriormente se efectúa la captación de la máxima velocidad de transmisión de la que escapaz el módem conectado. La detección se realiza mediante la función intget_speed_auto(void) la cual retorna un valor –1 en caso de que exista error con loscomandos solicitados y requiera de un suministro externo de esa información.

Debido a que determinados módem no disponen de los comandos ATBi (Véaseapartado 2.2.2. Los comandos Hayes o AT) para calcular esa velocidad máxima, sedispone de la función int get_speed_manual(void) que requiere del conocimiento previo dela máxima velocidad de transmisión posible del módem. Así, de forma manual se introduceel valor en baudios de esa velocidad.

Una vez establecida esa velocidad máxima, se realiza la reconfiguración de la UARTpara esa velocidad de transmisión y se inicializa el módem para ubicarlo en un estado aptopara trabajar en nuestro sistema.

Para suministrar información del módem (nombre del producto y otra información),se ejecuta la función int get_data_modem(char modem_data[100]). Esta función tiene elobjetivo de cargar un registro de 100 caracteres con la información obtenida del módemmediante el comando ATI6. Posteriormente se escribe esa información mediante el uso dela función void escribe_inf_modem(char datos[NCINFM]), donde NCINFM es el Númerode Caracteres de INFormación del módem.

Seguidamente se procede a la efectuación del establecimiento de conexión.

Primeramente se debe aclarar si se desea efectuar una llamada o a responderla.Cuando se especifica que se desea realizar una llamada a un sistema remoto, primeramentese debe especificar el número de abonado o el nodo con el que se quiere establecer lacomunicación mediante la función void get_tel_number(char tel_number[15]). La filosofíaque sigue esta función para la captación de ese número es la de cargar un registro dequince celdas y salir cuando éste se ha completado o bien si se detecta el carácter deretorno de carro (CR). Asegura que todos los caracteres introducidos sean numéricos y nosuministra ese teléfono hasta que el usuario confirma el número introducido.

Seguidamente, mediante la utilización de la función int marca_tel(char nt[15]) seprosigue el proceso de establecimiento de conexión. Esta función reinicializa el módem(mediante el comando ATZ0) para evitar posibles estados no deseados como resultado desu utilización en otros programas. Se dispone de una temporizador interno paracontabilizar el tiempo tras la emisión de cada comando enviado al módem e informar de unposible error en la comunicación si se excede temporalmente. Tras la marcación seestablece la negociación del protocolo de error y compresión a utilizar y la velocidad detransmisión de datos entre los dos módem negociantes. Finalmente, la función informamediante un mensaje de la correcta conexión.

Si la intención del usuario es realizar la respuesta de una llamada, debe especificar siesa respuesta de realizará de forma automática o de forma manual. La primera forma es útilpara el caso en que no exista ningún usuario en el sistema receptor de la llamada. Debido alformato del protocolo X-MODEM utilizado en nuestro algoritmo, tras haber realizado laconexión de forma automática, el entorno se sitúa en la página Transmisión de Datosaguardando la señal de preparado del sistema llamante. Esta situación se debe a que el

Page 45: Comunicación de dos ordenadores mediante el …deeea.urv.cat/public/PROPOSTES/pub/pdf/517pub.pdf · sistema de comunicaciones es captar señales digitales y modularlas para la emisión

4. DESCRIPCIÓN DE LA SOLUCION ADOPTADA Comunicación de dos ordenadores con protocolo x-módem

43

sistema receptor en la transmisión de datos con protocolo X-MODEM es quien informa deque se encuentra preparado para la recepción de datos mediante la emisión del carácterNAK, repitiendo hasta 10 veces este proceso si el sistema emisor no responde. Por esemotivo, se fuerza a ser el elemento transmisor de datos de un fichero, previamenteespecificado, el que realice la autorespuesta. Cabe notar que en este caso se desactiva elcontador de tiempo que activa la señal TimeOut para evitar la salida del sistema antes deefectuar todo el proceso de conexión. En caso que se quiera salir, se debe esperar 60segundo tras la pulsación de la tecla ESC. Ese control se realiza mediante el condicionante,presente en la rutina de atención al reloj, que no permite el incremento de los contadores encaso de que la variable global stop se encuentre a ‘1’ lógico.

La función que sitúa el módem en modo autorespuesta es int conf_mod_auto_r(void),que se basa en la carga del registro S0 = 1 para que efectúe la respuesta tras la primeraseñal de llamada recibida.

Si por lo contrario, se desea establecer la respuesta de forma manual, se utiliza lafunción int resp_llam(void). Simplemente envía el comando ATA al módem en elmomento oportuno de la llamada.

Después de establecer comunicación, el entorno permite cambiar de página paraproceder al Proceso de Transmisión de Datos o al Proceso de Recepción de Datos.

4.2.4. Transmisión de Datos

El acceso a esta página del entorno se realiza mediante la función voidwin_send_file(defmenu menu4[3]).

Esta función inicialmente realiza el dibujo de la página y escribe los diferentesenunciados que describen los diversos campos explicativos para ayudar a la comprensióndel programa por parte del usuario.

Después de este primer proceso, similar al tratado en el Entorno de Configuración, lafunción tiene como primer gran objetivo establecer el nombre del fichero a transmitir. Paraevitar complicar el algoritmo de la subrutina de atención a la interrupción de teclado, seutiliza la subrutina que viene en el sistema por defecto. Eso comporta la recarga del vectorde interrupción referente al teclado mediante la función void fin_kb(void). Ésta recarga esevector con el valor que tenía previamente a la inicialización del sistema en nuestroprograma. Posteriormente se capta la cadena de caracteres que define el nombre del ficheroa transmitir. La apertura de ese fichero se realiza en el interior de la función intcuenta_bloques(char n_fichero[38]), que tiene como propósito realizar la cuenta deltamaño del fichero especificado. En el caso que no existe ese fichero, retorna un valorNULL. Por ende, no se sale de este primer proceso hasta que se informe de la correctaapertura de un fichero existente en memoria.

Como ya se ha comentado, la función int cuenta_bloques(char n_fichero[38]) realizala cuenta del total de bloques existentes en el fichero para posteriormente informar alusuario del estado del proceso de transmisión de los datos. Es decir, dentro de esta páginade transmisión de datos existe una barra de proceso que informa en todo momento lacantidad de información que resta para finalizar. Por ese motivo se hace esencial eseconocimiento del tamaño del fichero. Nótese que el fichero se cierra tras haber realizadotoda la cuenta.

Page 46: Comunicación de dos ordenadores mediante el …deeea.urv.cat/public/PROPOSTES/pub/pdf/517pub.pdf · sistema de comunicaciones es captar señales digitales y modularlas para la emisión

4. DESCRIPCIÓN DE LA SOLUCION ADOPTADA Comunicación de dos ordenadores con protocolo x-módem

44

Seguidamente a la definición del fichero y a la cuenta de bloques, se debe abrir elarchivo para lectura con el propósito de realizar la transmisión de datos.

Inicialmente el sistema se sitúa en estado de espera durante 1 minuto (en modorespuesta manual) para la recepción del carácter NAK emitido por el sistema receptorindicando que se encuentra listo para la recepción de datos. En caso de activarse la señalTimeOut, que indica desbordamiento del contador de tiempo, se sale de la página cerrandoel fichero y anulando todo el proceso de transmisión de datos.

La recepción del carácter se realiza mediante la utilización de la función intrecibe_dato(unsigned char *r_data). Su funcionamiento se detalla en el apartado siguiente.

La transmisión del fichero se realiza mediante la función int send_file(FILE *f, intntblck). Como resultado de la emisión del fichero especificado, retorna un valor numéricoque codifica el motivo por el cual se sale de la función, es decir, si se ha transmitidocorrectamente el fichero, si se ha recibido una carácter de cancelación (CAN), si se hasuperado el número de intentos de emisión de un bloque determinado, etc.

La transmisión del fichero se realiza fraccionando la información en bloques dedatos. Por tanto, antes de realizar la emisión de los respectivos bloques, hay que considerarun paso previo: la creación de los bloques de datos.

Para generar esos bloques, se dispone de la función int make_block(unsigned char*bl,char blk,FILE *ff). Esta función genera un bloque a partir de la última lectura de uncarácter del fichero respetando las condiciones de formato que establece el protocolo X-MODEM. Así, encabeza el registro mediante el carácter SOH, posteriormente enumera elbloque según el contenido de la variable blk y realiza su complemento a uno como obligael protocolo. Seguidamente realiza la lectura de datos del fichero especificado yfinalmente, tras ejecutar la función unsigned chk_sum(unsigned char vector[132]), cargael byte CHK situado en última posición. Esta función extrae como resultado un valornumérico que informa si el fichero se ha leído por completo o no para evitar entrar denuevo cuando ya no existen datos a transmitir. Tal como el protocolo exige, cuando noexisten datos a transmitir, el registro de datos se rellena mediante caracteres NULL.

Una vez se dispone del bloque realizado, se procede a su transmisión. Existe unafunción que tiene ese objetivo, la char manda_block(unsigned char block[132]). Estafunción realiza la transmisión de byte a byte, apoyándose en la función intmanda_dato(unsigned char DATO) y del estado de la variable data_trans.

La variable entera data_trans es global por variar su contenido dentro de la subrutinade atención a la UART. En el momento en que se realiza la petición de interrupción debidoa que el registro de datos THR se encuentra vacío, asertamos esa variable a estado lógico‘1’ para indicar a la función que se ha completado la transmisión de un octeto de datos.Posteriormente, en la función int mada_dato(unsigned char DATO) ubica la variabledata_trans al valor ‘0’ justo en el momento de realizar la carga del THR y de ese modoindicar que existe un dato a transmitir. Después de esas operaciones, la función intmanda_dato(unsigned char DATO) entra en un bucle y no sale hasta que percibe el cambiode la variable data_trans que indique que la transmisión del dato cargado finalizó. De esemodo se transmite todos los bytes existentes en el bloque construido anteriormente hasta ladetección de la transmisión de los 132 bytes que marcan su contenido. Dentro de estafunción se realiza el control de flujo de datos entre la UART y el módem mediante lasseñales RTS y CTS. Justo antes de transmistir un dato, la función observa el estado en quese encuentra la señal CTS. Si se encuentra activada indicará que el módem se encuentra en

Page 47: Comunicación de dos ordenadores mediante el …deeea.urv.cat/public/PROPOSTES/pub/pdf/517pub.pdf · sistema de comunicaciones es captar señales digitales y modularlas para la emisión

4. DESCRIPCIÓN DE LA SOLUCION ADOPTADA Comunicación de dos ordenadores con protocolo x-módem

45

disposición de adquisición de nuevos datos desde la UART. En caso contrario, el sistemaubica a ‘1’ la señal RTS y espera a que el módem aserte la señal CTS.

Antes de efectuar la transmisión de un byte, se realiza un reset del contador temporalpara asegurar la estabilidad del programa y evitar que entre en un bucle infinito esperandoel cambio de la variable data_trans después de algún error que lo impide. En el caso queno se envíe el dato desde el DTE hacia el módem, se activa la variable TimeOut la cualsacaría de ese bucle infinito el sistema y permitirá informar al usuario de la presencia de undeterminado error. En ese caso, la función int manda_dato(unsigned char DATO) extraeráel valor –1.

La función char manda_block(unsigned char block[132]) realiza la tarea de enviarun bloque mediante la utilización adecuada de la función int manda_dato(unsigned charDATO). Posteriormente a la emisión de todo el bloque, permanece a la espera de un bytede respuesta por parte del sistema receptor. En el caso que se supere un tiempo prudencialdesde la finalización de la transmisión del bloque, devolverá el carácter NAK poractivación de TimeOut. En caso contrario, devolverá el carácter emitido por el sistemaremoto. En el caso de recibir un carácter de reconocimiento ACK, incrementará elcontador de bloques enviados, informará al usuario y actualizará la barra de proceso detransmisión de datos. Posteriormente, si existen más datos para enviar, se repetirá elproceso. Empero, en el caso de recibir un carácter de reconocimiento negativo NAK, seincrementará el contador de número de iteraciones erróneas y se reenviará el bloque hastase perciba un ACK o se haya superado 10 intentos, lo cual abortará la transmisión.

Después de haber transmitido todo el fichero, se emitirá el carácter de fin detransmisión correcto (EOT) y esperará la contestación del sistema receptor de un ACK, locual finalizará la transmisión del fichero.

4.2.5. Recepción de Datos

La representación de esta página viene dada por la función voidwin_rece_file(defmenu menu5[3]).

Inicialmente se establece el formato de la página y se escriben los diferentesenunciados que representan los diversos campos existentes. Posteriormente, tras indicarpor parte del usuario el deseo de recibir datos de un sistema remoto presionando ENTER eintroduciéndose en la página, se debe establecer el nombre que representará el ficherorecibido. Para indicar que el título de ese fichero no está consolidado, una barra de tareas,ubicada en la parte superior de la ventana, se colorea de rojo y espera la recepción decaracteres transmitidos desde el teclado. Con el propósito de no complicar el algoritmo dela subrutina de atención a teclado se utiliza la antigua. Por tanto, se debe reestablecer elcontenido del vector de interrupciones número 9, que hace referencia al teclado mediantela función void fin_kb(void). Una vez completado el proceso de detección del título delfichero a recibir, el sistema queda configurado con la nueva subrutina para continuar con elcorrecto desarrollo del programa. La función que retorna la dirección de la nueva subrutinaal vector de interrupción del teclado es la void ini_kb(void).

Una vez se dispone de ese título, se realiza la apertura del fichero como escritura.Nótese que la apertura de un fichero para escritura borra por completo su contenido si setrata de un fichero existente. Por ese motivo, debe cerciorarse del nombre que toma estevalor para evitar la pérdida no deseada de información.

Page 48: Comunicación de dos ordenadores mediante el …deeea.urv.cat/public/PROPOSTES/pub/pdf/517pub.pdf · sistema de comunicaciones es captar señales digitales y modularlas para la emisión

4. DESCRIPCIÓN DE LA SOLUCION ADOPTADA Comunicación de dos ordenadores con protocolo x-módem

46

El receptor debe informar que se encuentra preparado para la recepción de datos. Porese motivo y por el formato del protocolo X-MODEM, el primer paso en el proceso detransmisión de datos es emitir un carácter de reconocimiento negativo NAK. Después deesa emisión, el sistema queda expectante de la recepción de un carácter SOH que marcaráel inicio de transmisión de un bloque.

El primer bloque de datos que se transmite es la información sobre el número total debloques a transmitir, calculado en el sistema emisor mediante la función intcuenta_bloques(char n_fichero[38]). El valor suministrado llegará como bloque número 1y en su trama de datos llegarán los caracteres que constituyen el valor total, siendo la cifrade menor peso el primer carácter recibido, y el de mayor peso el último. Por tanto, tras larecepción de ese bloque, el sistema receptor debe interpretar ese conjunto de caracteresnuméricos. Así, mediante la función int convert_car_num(unsigned char nmr[132]) serealiza la conversión de esa trama de caracteres a un valor específico. Esta función realizala permutación de la posición de los caracteres, situando la cifra que representa el valor demás peso en primera posición y el de menor peso en última. Posteriormente se realiza laconversión de caracteres a valores numéricos restando el valor que representa el códigoASCII para el carácter ‘0’. Finalmente se realiza la suma de valores teniendo en cuenta laposición donde se sitúa cada componente de la cifra.

Seguidamente se transmite el conjunto de bloques que determinan el contenido delfichero. El primer bloque será el número 1 y el último el 0. Después de la transmisión delos 256 bloques de datos, el algoritmo realiza un reset del contador de bloques ubicándoloa uno para iniciar de nuevo. Cuando se agotan los caracteres a transmitir, el bloque, si nose encuentra completamente cargado, se debe cargar a 0s a lo largo de toda la trama dedatos.

Tras la emisión de cada bloque, se procede al cálculo de detección de error en latrama mediante la función unsigned char chk_sum(unsigned char vector[132]), que realizael cálculo del checksum de los caracteres de datos recibidos en el bloque para la posteriorcomparación con el byte CHK préviamente calculado y enviado por el sistema emisor. Elcálculo del checsum se realiza sumando todos los valores que contiene el bloque ydividiendo entre 256 para obtener el resto de esta fracción. De esta forma se obtiene losocho bits menos significativos de la suma.

La recepción del fichero se realiza mediante la ejecución de la función intrecep_file(char file_name[38]). Dispone de una variable de entrada para indicar el nombredel fichero donde se almacenará la información recibida, y una variable entera de salidapara indicar si la recepción del fichero finalizó correctamente.

La recepción de un bloque se realiza mediante la función char recep_block(unsignedchar block_r[132],int numb). Para detectar si el número de bloque es el correcto, se debesuministrar el número de bloques contados en el sistema receptor.

La función devuelve un carácter informando del estado de la recepción de datos. Sidevuelve un carácter ACK, se actualiza la barra de estado de recepción de datos, seinforma del número de fichero recibido y se aumenta el contador de bloques. Finalmenteemite hacia el sistema emisor un carácter de reconocimiento (ACK) para que prosiga conla emisión de más datos.

En el caso de que la función devuelva un NAK, primeramente se incrementa uncontador del número de intentos fallidos para controlar que no se supera los 10 intentos.Posteriormente informa al usuario de la existencia de un error y del número de intento de la

Page 49: Comunicación de dos ordenadores mediante el …deeea.urv.cat/public/PROPOSTES/pub/pdf/517pub.pdf · sistema de comunicaciones es captar señales digitales y modularlas para la emisión

4. DESCRIPCIÓN DE LA SOLUCION ADOPTADA Comunicación de dos ordenadores con protocolo x-módem

47

recepción del dato. Finalmente se informa al sistema emisor de la incorrecta recepciónmediante un carácter de reconocimiento negativo (NAK).

En el caso que se obtenga un carácter CAN, el sistema informa al usuario de laactivación del contador TimeOut y emite al sistema emisor el carácter de cancelación CANpara proceder a la finalización incorrecta de la transmisión.

Finalmente, si la función devuelve el carácter EOT, se informa al usuario de que nohay más datos para transmitir y por tanto se finaliza el proceso de transmisión de datos. Alsistema emisor se le envia el carácter de reconocimiento ACK para permitir la finalizaciónde transmisión.

La recepción un dato se realiza mediante la función int rececibe_dato(unsigned char*r_data). La UART, configurada para que genere interrupciones debido al cambio deestado de los registros de datos, realiza una petición de interrupción cuando detecta que suregistro de entrada de datos (RBR) se ha cargado completamente. Así, en la rutina deatención ubica a estado ‘1’ la variable global data_recep, que informa de la llegada de undato. En la función exite un bucle cerrado que tiene como condición no salir del mismohasta que la variable data_recep se sitúe a valor ‘1’, indicando que existe un dato cargado.Posteriormente, se trata el octeto obtenido y se sitúa la variable data_recep a ‘0’ parainformar que se ha captado el dato y que el sistema se encuentra preparado para larecepción de otro dato.

En el caso de que el bucle permanezca más de un tiempo prudencial estimado, lavariable TimeOut se aserta y provoca la salida del bucle indicando algún error.

En caso que la comunicación con el sistema remoto se pierda, la recepción deinformación se corta y sale de la página de recepción de fichero para situarse en la deconfiguración, con el propósito de establecer una nueva conexión.

Page 50: Comunicación de dos ordenadores mediante el …deeea.urv.cat/public/PROPOSTES/pub/pdf/517pub.pdf · sistema de comunicaciones es captar señales digitales y modularlas para la emisión

5 MANUAL DE USUARIO

Page 51: Comunicación de dos ordenadores mediante el …deeea.urv.cat/public/PROPOSTES/pub/pdf/517pub.pdf · sistema de comunicaciones es captar señales digitales y modularlas para la emisión

4. DESCRIPCIÓN DE LA SOLUCION ADOPTADA Comunicación de dos ordenadores con protocolo x-módem

2

ÍNDICE

5.1. EJECUCIÓN DEL PROGRAMA pág. 50

5.2. ENTORNO DE CONFIGURACIÓN pág. 51

5.3. MARCACIÓN DE UNA LLAMADA pág. 53

5.4. RESPUESTA A UNA LLAMADA pág. 55

5.5. EMISIÓN DE UN FICHERO pág. 56

5.6. RECEPCIÓN DE UN FICHERO pág. 57

5.7. SALIR DEL PROGRAMA pág. 58

Page 52: Comunicación de dos ordenadores mediante el …deeea.urv.cat/public/PROPOSTES/pub/pdf/517pub.pdf · sistema de comunicaciones es captar señales digitales y modularlas para la emisión

5. MANUAL DE USUARIO Comunicación de dos ordenadores con protocolo x-módem

49

5.1. Ejecución del programa

El programa detransmisión de ficheros entredos computadores conprotocolo de comunicacionesX-MODEM presentado, estápensado para ejecutarse bajoel sistema operativoMSDOS. El requerimiento deun entorno unitarea esnecesario puesto que lautilización de los diferentesdispositivos necesarios debereservarse para el uso denuestro programa, sininterrupción en ladisponibilidad de losmismos.

Para iniciar el programa bastará con introducir el título tranfile.exe en la línea decomandos del sistema operativo.

La pantalla inicial del programa informa del título, autor y director del proyectorealizado. Se suministrará 4 segundos al usuario para leer la información mostrada enpantalla. El transcurso de ese tiempo se observará mediante una barra gris ubicadaaproximadamente a mitad de pantalla que se extenderá según el tiempo transcurrido.

En este entorno existe un código de colores para facilitar su uso, significandodiferentes situaciones según sea:

• Color amarillo: Los objetos pintados de color amarillo indicarán posibilidadde cambio, pudiendo establecer otras selecciones según se desee mediante eluso del cursor del teclado (flechas de selección).

• Color rojo: El objeto que se encuentre pintado de ese color, indicará que se haseleccionado y que es imposible cambiar de selección a no ser que se efectúeuna determinada maniobra que vuelva ese objeto de color amarillo. Muchasveces será posible mediante la utilización de la tecla de escape ESC.

• Color gris: Este color indica que el objeto se encuentra seleccionado deantemano y que es no es posible variar su contenido o su estado a no ser quese ejecute una determinada maniobra que permita realizar los cambiosdeseados.

Page 53: Comunicación de dos ordenadores mediante el …deeea.urv.cat/public/PROPOSTES/pub/pdf/517pub.pdf · sistema de comunicaciones es captar señales digitales y modularlas para la emisión

5. MANUAL DE USUARIO Comunicación de dos ordenadores con protocolo x-módem

50

5.2. Entorno de configuración

Transcurridos los 4 segundos, el programa muestra la pantalla de Entorno deConfiguración, titulada en la barra de tareas como Configurar.

El usuario no tendrá posibilidad de acceder a otra página hasta que no se hayaconfigurado el sistema de comunicaciones y establecido la comunicación con un sistemaremoto.

Por tanto, para iniciar la configuración se deberá presionar la tecla ENTER. Esoprovocará un cambio en el color del cuadro de selección de la barra de tareas pasando delcolor amarillo al color rojo para indicar que nos encontramos dentro de la página ydispuesto a iniciar la configuración. Seguidamente uno de los círculos de selección denúmero de puerto se pondrá en amarillo para indicar que se puede cambiar a la opcióndeseada. Una vez seleccionado el puerto serie a utilizar, confirmaremos mediante lapulsación de la tecla ENTER. Eso provocará un cambio de color en el cuadro escogido,pasando de amarillo a rojo para indicar la opción final seleccionada. Al mismo tiempo, seseleccionará el círculo inferior de selección de detección de velocidad automática o manualen color amarillo. En el caso que por algún motivo se quiera seleccionar de nuevo elnúmero de puerto, bastará con presionar la tecla ESC.

En caso de seleccionar la opción de selección de velocidad automático, el sistemainiciará una secuencia de emisión de comandos al módem para establecer esa velocidad.En módems que dispongan de LED’s de TD (dato transmitido) y SD (dato enviado) sepodrá observar un parpadeo indicando que el módem se está comunicando con el PC.

Téngase en cuenta que la velocidad que se autoconfigurará en el sistema será lamáxima posible por el módem conectado y no la máxima del sistema. Por lo tanto habráque tener cuidado con esta opción si el sistema remoto dispone de un módem más lento,puesto que no funcionará correctamente la transmisión de datos.

Page 54: Comunicación de dos ordenadores mediante el …deeea.urv.cat/public/PROPOSTES/pub/pdf/517pub.pdf · sistema de comunicaciones es captar señales digitales y modularlas para la emisión

5. MANUAL DE USUARIO Comunicación de dos ordenadores con protocolo x-módem

51

Esta opción de autoconfiguración de velocidad del sistema no será posible enaquellos módems que no dispongan de los comando Hayes que configuran la velocidad. Enese caso, el entorno seleccionará la opción de velocidad manual y el usuario deberáintroducir un valor de velocidad que se encuentre dentro del rango que informa elfabricante del módem. El requisito indispensable que se requiere es que la velocidadintroducida sea una de las indicadas en pantalla, justo a la parte derecha de la etiquetaVELOCIDAD. Esto se realiza de esta forma debido a que los módems utilizan velocidadesestandarizadas. En caso de no detectar esa condición, el programa no prosigue y mantienela espera a la introducción de una velocidad válida.

Posteriormente se realiza una inicialización de estado del módem para evitar estadosno deseados antes de efectuar la comunicación de datos. Según este proceso deinicialización, el sistema informará si no se detecta la señal DSR, si hay error deinicialización o si todo ha transcurrido correctamente. La información sobre la detecciónde la señal DSR servirá para los usuario que dispongan de un módem con estacaracterística y puedan detectar inicialmente que el sistema no detecta el módem. En otroscasos, el módem no suministra esa información, lo cual no quiere decir que el módem nose encuentre conectado.

Cuando la velocidad del módem se ha seleccionado correctamente, el programa captainformación del módem sobre la marca del fabricante y la anuncia en pantalla. Debido a lagran variedad de módems existente en el mercado, es posible que algunos no tengan estaopción. En este caso, el programa espera hasta 10 segundos e informa al usuario de laimposibilidad de obtener los datos de información del módem mediante el mensaje: Datosde módem no obtenidos...

Después de obtener los datos de información suministrados por el módem, elprograma encuesta al usuario para conocer el propósito iniciar una llamada o responderla.En caso de desear volver a la situación de inicio, presione la tecla ESC.

Page 55: Comunicación de dos ordenadores mediante el …deeea.urv.cat/public/PROPOSTES/pub/pdf/517pub.pdf · sistema de comunicaciones es captar señales digitales y modularlas para la emisión

5. MANUAL DE USUARIO Comunicación de dos ordenadores con protocolo x-módem

52

5.3. Marcación de una llamada

Para seleccionar el deseo de originar una llamada, se debe presionar la tecla [M] delteclado. Seguidamente aparecerá un mensaje solicitando el número de teléfono de quien vaa establecer comunicación con nuestro sistema. Introducido el valor numérico en la zonareservada para ese propósito, se debe pulsar la tecla ENTER para finalizar la introduccióndel número. También finaliza la introducción si se supera en 15 dígitos el número deteléfono.

Posteriormente el programa solicita comprobación de ese número al usuario, quiendeberá responder pulsando la tecla [S] o la tecla [N]. En caso negativo, se repetirá elproceso hasta obtener el número de teléfono correcto.

Después de obtener el número correcto a discar, el programa inicia la secuencia deinicialización del módem y el discado del número introducido.

Page 56: Comunicación de dos ordenadores mediante el …deeea.urv.cat/public/PROPOSTES/pub/pdf/517pub.pdf · sistema de comunicaciones es captar señales digitales y modularlas para la emisión

5. MANUAL DE USUARIO Comunicación de dos ordenadores con protocolo x-módem

53

En el último proceso de la conexión, el sistema informa que se efectuó correctamentetodo el proceso mediante otro mensaje.

En el proceso de marcación de un número pueden aparecer diversos problemas: queel módem no esté conectado y sea imposible emitir los pertinentes comandos, que en elproceso de negociación de velocidad y protocolos de compresión y error entre los módemse pierda por caída de la línea telefónica, etc. Por ese motivo, en el caso que aparezca unproblema, el programa espera hasta 10 segundos después de la detección del fallo.Posteriormente informa al usuario que la comunicación no se pudo llevar a cabo y lemanda de nuevo a la página de configuración para iniciar el proceso. En ese momento, elusuario deberá cerciorarse si el puerto que utiliza es el correcto y no está estropeado o quela velocidad del módem sea la correcta (en caso de seleccionar velocidad manual).

Page 57: Comunicación de dos ordenadores mediante el …deeea.urv.cat/public/PROPOSTES/pub/pdf/517pub.pdf · sistema de comunicaciones es captar señales digitales y modularlas para la emisión

5. MANUAL DE USUARIO Comunicación de dos ordenadores con protocolo x-módem

54

5.4. Respuesta a una llamada

La respuesta de a una llamada originada por un sistema remoto, se puede proceder deforma automática o de forma manual.

En el primer caso, el programa se ubica en la página de emisión de datos y espera aque una llamada entrante proceda. Seguidamente se establece la comunicación entresistemas y el sistema llamante, que será forzosamente el sistema receptor de datos, emiteun carácter NAK indicando que se encuentra listo para transmitir datos. En el caso que sequiera salir de esta opción, debe presionar la tecla ESC y después del transcurso de 15segundos, el sistema volverá a la situación inicial.

En el segundo caso, la respuesta se realiza en el momento que el usuario deseecontestar, presionando la tecla [M]. Posteriormente se inicia el proceso de inicializacióndel módem y de negociación con el otro módem.

Seguidamente se informará si la conexión se estableció correctamente o no mediantelas misma ventanas mostradas en el apartado anterior Marcación de una llamada.

Una vez finalizada el proceso de conexión, se deberá indicar si nuestro sistema seráel emisario del fichero o el receptor. Dependiendo de la función que desarrollará, el usuariosituará el cuadro de selección de la barra de tareas en la posición Envia_fichero oRecibe_fichero.

Page 58: Comunicación de dos ordenadores mediante el …deeea.urv.cat/public/PROPOSTES/pub/pdf/517pub.pdf · sistema de comunicaciones es captar señales digitales y modularlas para la emisión

5. MANUAL DE USUARIO Comunicación de dos ordenadores con protocolo x-módem

55

5.5. Emisión de un fichero

Tras haber realizado el proceso de conexión con un sistema remoto, el programapermite viajar entre las diferentes páginas que constituyen el entorno.

Para establecer nuestro sistema como el emisor de datos, se debe ubicar el cursorselectivo de la barra de tareas inferior en la posición Envia_fichero.

Después de seleccionar esta página presionando la tecla ENTER, se solicita elnombre del fichero a transmitir. En el caso que no se detecte, el sistema informa y realizala petición de otro nombre. No continua el procedimiento de transmisión hasta que seestablezca un archivo existente.

Una vez cargado elnombre del archivo, elsistema realiza la carga de labarra de procesoconsiderando el número totalde bloques existente.Seguidamente se mantiene ala espera de la recepción dela señal emitida por elsistema receptor que informade que se encuentra listo parael trasiego de información.En el caso que no percibaninguna señal, el sistemaespera hasta 60 segundospara posteriormente salir dela página.

En cuanto se percibe la señal esperada, se procede a la transmisión de datos,informando del estado en que se encuentra mediante la barra de proceso y los mensajes quedetallan el número de bloque transmitido.

Page 59: Comunicación de dos ordenadores mediante el …deeea.urv.cat/public/PROPOSTES/pub/pdf/517pub.pdf · sistema de comunicaciones es captar señales digitales y modularlas para la emisión

5. MANUAL DE USUARIO Comunicación de dos ordenadores con protocolo x-módem

56

5.6. Recepción de un fichero

Para establecer el equipo como el sistema receptor de datos, debe situarse el cursorselector de página de la barra de tareas en la posición que lleva el nombre Recibe_fichero.

Inicialmente se debe establecer el nombre del fichero donde se almacenará lainformación recibida. El programa no controla el borrado de un fichero en caso que exista,puesto que lo sobrescribirá con la nueva información. Por ende, se debe tener máximaprecaución de no nombrar un fichero existente para evitar la pérdida no deseada deinformación.

Una vez se establece el nombre del fichero, el programa emite un carácter dereconocimiento negativo parainformar de su disposiciónpara la recepción de datos.Emitirá hasta 10 de estoscaracteres si el sistemaemisor no los detecta, aintervalos de 10 segundos. Sisobrepasa ese número deintentos, el sistema cierra esapágina informando al usuariodel problema.

Si el sistema emisorpercibe la señal emitida porel receptor, se inicia latransmisión de datos, siendoel primer bloque el queinforme del número total debloques a emitir.

La página informará del estado de la transmisión mediante los mensajes informativosdel número de proyecto recibido y la barra de proceso, tal como se observa a continuación:

Page 60: Comunicación de dos ordenadores mediante el …deeea.urv.cat/public/PROPOSTES/pub/pdf/517pub.pdf · sistema de comunicaciones es captar señales digitales y modularlas para la emisión

5. MANUAL DE USUARIO Comunicación de dos ordenadores con protocolo x-módem

57

5.7. Salir del programa

En el momento en que se finalice la transmisión de datos con el sistema remoto y sedesee finalizar el programa, bastará con presionar la tecla de escape (ESC).

Si se presiona esa tecla mientras el sistema se encuentra transmitiendo o recibiendodatos, se cortará la conexión y lógicamente la transmisión para situarse en la página deConfiguración del Sistema con el propósito de iniciar toda la tarea de configuración yconexión.

Si el sistema se encuentra en situación de desconexión y no se ha seleccionadoninguna página del entorno, se saldrá del programa con la siguiente pantalla:

Page 61: Comunicación de dos ordenadores mediante el …deeea.urv.cat/public/PROPOSTES/pub/pdf/517pub.pdf · sistema de comunicaciones es captar señales digitales y modularlas para la emisión

6. REFERENCIAS Comunicación de dos ordenadores con protocolo x-módem

59

6 Referencias

[1] MUHAMAD ALI MAZIDI y JANICE GILLISPIE MAZIDI: The 80x86IBM PC and compatible Computers (Volume I & II).

[2] JOSÉ MANUEL HUNDROBO: Todo sobre las comunicaciones.

[3] GUIA DE USUARIO DEL MODEM ROCKWELL 14.4Kbps VOZ / FAX.

[4] RAFAEL CRUZ R.: Apuntes de la asignatura Comunicación DigitalAvanzada. Universidad Autónoma de Nuevo León.

[5] ESTEBAN DEL CASTILLO: Apuntes de la asignatura InformáticaIndustrial II. Universidad Rovira i Virgili.

Page 62: Comunicación de dos ordenadores mediante el …deeea.urv.cat/public/PROPOSTES/pub/pdf/517pub.pdf · sistema de comunicaciones es captar señales digitales y modularlas para la emisión

7 ANEXOS

Page 63: Comunicación de dos ordenadores mediante el …deeea.urv.cat/public/PROPOSTES/pub/pdf/517pub.pdf · sistema de comunicaciones es captar señales digitales y modularlas para la emisión

7. ANEXO 1: ALGORITMO Comunicación de dos ordenadores con protocolo x-módem

61

ANEXO 1: ALGORITMO

ÍNDICE

• LIBRERÍAS pág. 63

• CONSTANTES pág. 64

• DEFINICIÓN DE TIPOS pág. 65

• DECLARACIÓN DE FUNCIONES pág. 66

• VARIABLES GLOBALES pág. 67

• PROGRAMA PRINCIPAL pág. 68

• RUTINAS DE ATENCIÓN A INTERRUPCIÓN pág. 70

o void interrupt reloj(__CPPARGS) pág. 70

o void interrupt teclado(__CPPARGS) pág. 71

o void interrupt uart(__CPPARGS) pág. 73

• FUNCIONES DE INICIALIZACIÓN DEL SISTEMA pág. 74

o int ini_system(void) pág. 74

o void opengraph(void) pág. 74

o void presentacion(void) pág. 74

o void ini_kb(void) pág. 75

o int ini_ls(unsigned int speed) pág. 75

o int ini_modem(void) pág. 76

• FUNCIONES DE CONVERSIÓN DE DATOS pág. 77

o int convert_num_car(unsigned char r_num[132],int num_blk) pág. 77

o int convert_car_num(unsigned char nmr[132]) pág. 77

• FUNCIONES RELACIONADAS CON LOS ENTORNOS pág. 78

o void win_setup(defmenu menu3[3]) pág. 78

o int win_send_file(defmenu menu4[3]) pág. 81

o void win_rece_file(defmenu menu5[3]) pág. 83

o void carga_menu(defmenu menu1[3]) pág. 84

o void pinta_entorno(int num_entorn) pág. 86

o void pinta_menu(defmenu menu2[3],int num_menu) pág. 87

o void pinta_cuadro(int c_x, int c_y,char name[18],int select) pág. 87

o void escribe mensaje(int xx,int *yy,int line_s,int_i,char texto[38]) pág. 88

o void paint_message(char mensaje[N_CHAR_M]) pág. 88

o void pinta_circle(int color_A, int color_B) pág. 89

o void escribe_inf_modem(char datos[NCINFM]) pág. 90

o void get_name_file(char name[38, defmenu menu6[3]) pág. 91

Page 64: Comunicación de dos ordenadores mediante el …deeea.urv.cat/public/PROPOSTES/pub/pdf/517pub.pdf · sistema de comunicaciones es captar señales digitales y modularlas para la emisión

7. ANEXO 1: ALGORITMO Comunicación de dos ordenadores con protocolo x-módem

62

• FUNCIONES RELACIONADAS CON LA TRANSMISIÓN DE DATOS pág. 92

o int send_file(FILE *f, int ntblck) pág. 92

o char manda_block(unsigned char block[132]) pág. 94

o int manda_dato(unsigned char DATO) pág. 94

o int recep_file(char name_file[38]) pág. 95

o char recep_block(unsigned char block_r[132], int numb) pág. 97

o int recibe_dato(unsigned char *r_data) pág. 97

o int cuenta_bloques(char n_fichero[38]) pág. 98

o int make_block(unsigned char *bl, char blk, FILE *ff) pág. 99

o unsigned char chk_sum(unsigned char vector[132]) pág. 100

• FUNCIONES RELACIONADAS CON EL MÓDEM pág. 101

o int conf_mod_auto_r(void) pág. 101

o void get_tel_number(char tel_number[15]) pág. 102

o int marca_tel(char nt[15]) pág. 102

o int resp_llam(void) pág. 104

o int get_data_modem(char modem_data[100]) pág. 105

o int get_speed_manual(void) pág. 106

o int get_speed_auto(void) pág. 107

o int trans_int(unsigned char uni, unsignedchar dec) pág. 108

• FUNCIONES RELACIONADAS CON EL CONTADOR DE TIEMPO pág. 109

o void pausa_seg(int sss) pág. 109

o void pausa_tic(int ttt) pág. 109

o void reset_timer(void) pág. 109

• FUNCIONES DE FINALIZACION DEL SISTEMA pág. 109

o void fin_system(void) pág. 109

o void fin_kb(void) pág. 110

o void colgar_modem(void) pág. 110

Page 65: Comunicación de dos ordenadores mediante el …deeea.urv.cat/public/PROPOSTES/pub/pdf/517pub.pdf · sistema de comunicaciones es captar señales digitales y modularlas para la emisión

7. ANEXO 1: ALGORITMO Comunicación de dos ordenadores con protocolo x-módem

63

/************************************* LIBRERIAS **************************************/#include <graphics.h>#include <stdlib.h>#include <stdio.h>#include <conio.h>#include <dos.h>#include <string.h>#include <math.h>

Page 66: Comunicación de dos ordenadores mediante el …deeea.urv.cat/public/PROPOSTES/pub/pdf/517pub.pdf · sistema de comunicaciones es captar señales digitales y modularlas para la emisión

7. ANEXO 1: ALGORITMO Comunicación de dos ordenadores con protocolo x-módem

64

/************************************* CONSTANTES ***********************************//* Constantes de ayuda a establecer entorno*/

#define SEP 2#define STEXT 140 /* Separacion de los enunciados de la barra de tareas*/#define W_FRM 120 /* Ancho cuadro de selecccion en la barra de tareas*/#define H_FRM 15 /* Alto cuadro selecccion de barra tareas*/#define HBT 30 /* Alto de la barra de tareas*/#define C_X0 115 /* Cordenada X circulo superior*/#define C_X1 415 /* Cordenada X del circulo inferior*/#define C_Y0 301 /* Cordenada Y del circulo superior*/#define C_Y1 420 /* Cordenada Y circulo inferior*/#define RADIO 4 /* Radio de los circulos de seleccion*/#define B_PRSx 110 /* Cordenada X de la barra de proceso*/#define B_PRSy 100 /* Cordenada Y de la barra de proceso*/#define W_PRS 20 /* Ancho de la barra de estado*/#define H_PRS 300 /* Alto de la barra de estado*/#define INI_SCR_SETUP_y 4 /* Cord. Y de inicio de mensajes del entorno de Configuracion*/#define INI_SCR_SETUP_x 11 /* Cord. X de inicio de mensajes del entorno de Configuracion*/#define FIN_LINE_SE 15 /* Cord. Y de final de mensajes del entorno de Configuracion*/.#define NCINFM 100 /* Numero de Caracteres de INFormacion del Modem*/#define INI_SCR_SR_y 8 /* Cord. Y de inicio de mensajes de entorno Send y RecepFile*/#define INI_SCR_SR_x 28 /* Cord. X inicio area mensajes del entorno Send y Recep File*/#define FIN_LINE_SR 24 /* Cord. Y fin area de mensajes de entorno Send y Recep File*/#define ALTO 50 /* Altura del cuadro de mensajes (paint_message)*/#define ANCHO 200 /* Anchura cuadro de mensajes (paint_message)*/#define N_CHAR_M 30 /* Numero de Caracteres maximo del mensaje*/#define SOH 1 /* Caracter :Start Of Header*/#define NAK 21 /* Caracter: Not AcKnowledge*/#define ACK 6 /* Caracter: ACKnowledge*/#define CAN 24 /* Caracter: CANcel*/#define EOT 4 /* Caracter: End Of Transmition*/#define CR 0x0D /* Caracter: ENTER*/#define VECT_KEYBOARD 9 /* Vector de dirección de la subrutina Atencion a Int deteclado*/#define VECT_CLOCK 8 /* Vector de dirección de la subrutina Atencion a Int de Reloj*/#define BASE_KEYBOARD 0x60 /* Direccion de memoria de E/S donde se situa el teclado*/

#ifdef __cplusplus#define __CPPARGS ...

#else#define __CPPARGS

#endif

Page 67: Comunicación de dos ordenadores mediante el …deeea.urv.cat/public/PROPOSTES/pub/pdf/517pub.pdf · sistema de comunicaciones es captar señales digitales y modularlas para la emisión

7. ANEXO 1: ALGORITMO Comunicación de dos ordenadores con protocolo x-módem

65

/********************************** DEFINICION DE TIPOS *******************************/typedef struct{

char nombre[13];int pos_x,pos_y;}palabra;

typedef struct{char title[18];int x,y;palabra menu[7];}defmenu;

Page 68: Comunicación de dos ordenadores mediante el …deeea.urv.cat/public/PROPOSTES/pub/pdf/517pub.pdf · sistema de comunicaciones es captar señales digitales y modularlas para la emisión

7. ANEXO 1: ALGORITMO Comunicación de dos ordenadores con protocolo x-módem

66

/******************************** DECLARACION DE FUNCIONES ************************//* Funciones de inicializacion del sistema--------------------------------------------------*/int ini_system(void);void opengraph(void);void presentacion(void);void ini_kb(void);int ini_ls(unsigned int speed);int ini_modem(void);/* Funciones de conversion de datos-------------------------------------------*/int convert_num_car(unsigned char r_num[132],int num_blk);int convert_car_num(unsigned char nmr[132]);/* Funciones relacionadas con los entornos------------------------------------------------*/void win_setup(defmenu menu3[3]);int win_send_file(defmenu menu4[3]);void win_rece_file(defmenu menu5[3]);void carga_menu(defmenu menu1[3]);void pinta_entorno(int num_entorn);void pinta_menu(defmenu menu2[3],int num_menu);void pinta_cuadro(int c_x,int c_y,char name[18],int select);void escribe_mensaje(int xx,int *yy,int line_s,int line_i,char texto[38]);void paint_message(char mensaje[N_CHAR_M]);void pinta_circle(int color_A,int color_B);void escribe_inf_modem(char datos[NCINFM]);void get_name_file(char name[38],defmenu menu6[3]);/* Funciones relacionadas con transmision datos---------------------------------------------------------*/int send_file(FILE *f,int ntblck);char manda_block(unsigned char block[132]);int manda_dato(unsigned char DATO);int recep_file(char file_name[38]);char recep_block(unsigned char block_r[132],int numb);int recibe_dato(unsigned char *r_data);int cuenta_bloques(char n_fichero[38]);int make_block(unsigned char bl[132],char blk,FILE *ff);unsigned char chk_sum(unsigned char vector[132]);/* Funciones relacionadas con el modem------------------------------------------------*/int conf_mod_auto_r(void);void get_tel_number(char tel_number[15]);int marca_tel(char nt[15]);int resp_llam(void);int get_data_modem(char modem_data[100]);int get_speed_manual(void);int get_speed_auto(void);int trans_int(unsigned char uni,unsigned char dec);/* Funciones relacionadas con el contador de timer------------------------------------------------------------*/void pausa_seg(int sss);void pausa_tic(int ttt);void reset_timer(void);/* Funciones de finalizacion del sistema-----------------------------------------------*/void fin_system(void);void fin_kb(void);void colgar_modem(void);

Page 69: Comunicación de dos ordenadores mediante el …deeea.urv.cat/public/PROPOSTES/pub/pdf/517pub.pdf · sistema de comunicaciones es captar señales digitales y modularlas para la emisión

7. ANEXO 1: ALGORITMO Comunicación de dos ordenadores con protocolo x-módem

67

/********************************* VARIABLES GLOBALES ******************************/unsigned int B_UART,VECT_LS;char cod_ant;unsigned char selection=0x00;int opcion, /* Marca numero de menu donde nos encuentramos*/

intro,painted;int tic=0,seg=0,min=0,

timeout=0, /* Variable de alarma por exceso de tiempo de espera*/data_trans, /* Variable de control de dato transmitido*/data_recep=0, /* Variable de control de dato recibido*/modem_conect, /* Variable de control de conexion establecida*/error_t=0,auto_resp=0, /* Variable que informa del modo autorespuesta*/exit_auto_resp, /* Variable que informa salir de modo autorespuesta*/stop=0; /* Interruptor de ON – OFF del timer*/

/************************ DECLARACION VARIABLES INTERRUPCION ********************/void interrupt reloj( __CPPARGS);void interrupt (*oldhandler_clk)( __CPPARGS);void interrupt teclado( __CPPARGS);void interrupt (*oldhandler_kb)( __CPPARGS);void interrupt uart( __CPPARGS);void interrupt (*oldhandler_ls)( __CPPARGS);

Page 70: Comunicación de dos ordenadores mediante el …deeea.urv.cat/public/PROPOSTES/pub/pdf/517pub.pdf · sistema de comunicaciones es captar señales digitales y modularlas para la emisión

7. ANEXO 1: ALGORITMO Comunicación de dos ordenadores con protocolo x-módem

68

/********************************* PROGRAMA PRINCIPAL ******************************/void main(void){/***************************************************************************************

Archivo:tranfile.c

Autor:Luis Enciso Morales

Fecha :31 de Agosto de 2.003

Descripcion:Programa que tiene el objetivo de realizar la transmision y la recepcion de ficherosmediante protocolo XMODEM.

***************************************************************************************/defmenu menu0[3]; /* String que almacena enunciados entornos*/

/* Inicializa el sistema----------------------------*/ini_system()presentacion();

/* Carga enunciados de los entornos-------------------------------------------*/carga_menu(menu0);

/* Establece el formato de la barra de tareas-----------------------------------------------------*/pinta_entorno(-1); /* Dibuja el entorno de la barra de tareas*/pinta_menu(menu0,-1); /* Escribe enunciados de la barra de tareas*/

/* Establece la pagina del entorno----------------------------------------*/opcion=0; /* Indica que esta en menu de configuracion*/painted=0; /* Indica deseo de pintar el entorno*/while (opcion!=-2) /* Iteramos hasta que se anuncie el deseo de salir*/

{if ((painted==0)||(auto_resp))

{switch(opcion) /* Viaja al entorno indicado por opcion*/{case 0:{/* Discrinamos segun el estado de la conexión*/

if (modem_conect==0)win_setup(menu0); /* Entorno de configuracion*/

else { /* Informa existencia de conexion e

imposibilidad de cambiar configuracion*/ clearviewport(); pinta_entorno(-1); /* Pinta barra de tareas*/

pinta_menu(menu0,-1); /* Escribe enunciados barra tareas*//* Dibuja el cuadro de seleccion */

pinta_cuadro(menu0[0].x+2*SEP,menu0[0].y,menu0[0].title,0); paint_message("CONEXION ESTABLECIDA...");}

break;}

Page 71: Comunicación de dos ordenadores mediante el …deeea.urv.cat/public/PROPOSTES/pub/pdf/517pub.pdf · sistema de comunicaciones es captar señales digitales y modularlas para la emisión

7. ANEXO 1: ALGORITMO Comunicación de dos ordenadores con protocolo x-módem

69

case 1:{if ((modem_conect==1)||(auto_resp)){win_send_file(menu0); /* Entra en entorno envio de

fichero*/ auto_resp=0; /* Fija cursor para espera receptor

ready tras conexion*/ }

break;}case 2:{if (modem_conect==1)

win_rece_file(menu0); /* Entra entorno recepcion fichero*/ break;}

}painted=1; /* Indica entorno pintado*/if ((modem_conect==0)&&(opcion>0)&&(!auto_resp))

{/* modem_conect valdra 0 si se desconecta la linea*/ paint_message("DESCONEXION DE LA LINEA!"); pausa_seg(1); paint_message("Configure el sistema."); pausa_seg(1); opcion=0; /* Para que entre en el menu de configuracion.*/ intro=0; /* Indicara que no existe seleccion*/ painted=0; /* Deseo de redibujar entorno*/}

}}

/* Finaliza el sistema-------------------------*/fin_system();}

Page 72: Comunicación de dos ordenadores mediante el …deeea.urv.cat/public/PROPOSTES/pub/pdf/517pub.pdf · sistema de comunicaciones es captar señales digitales y modularlas para la emisión

7. ANEXO 1: ALGORITMO Comunicación de dos ordenadores con protocolo x-módem

70

/************************ RUTINAS DE ATENCION A INTERRUPCION *********************/

void interrupt reloj( __CPPARGS){/************************************************************************************** Rutina de servicio de atencion a interrupcion de reloj. Interrupcion no enmascarable. TimeOut se aserta cuando supera 10 segundos despues de un reset. Si stop=0 el contador se para. Utilizado cuando el sistema se pone en modo autorespuesta. El 8253 realiza 18 interrupciones por segundo.**************************************************************************************/if (!stop)

{tic++; if (tic==18) {tic=0;seg++;} if (seg==60) {tic=0;seg=0;min++;} if (min==20) {tic=0;seg=0;min=0;} if (seg>9) {timeout=1;}}

eoi; /* Fin de interrupcion*/}

Page 73: Comunicación de dos ordenadores mediante el …deeea.urv.cat/public/PROPOSTES/pub/pdf/517pub.pdf · sistema de comunicaciones es captar señales digitales y modularlas para la emisión

7. ANEXO 1: ALGORITMO Comunicación de dos ordenadores con protocolo x-módem

71

void interrupt teclado( __CPPARGS){/*************************************************************************************** Rutina de sevicio de atencion a interrupcion de teclado. Nivel de interrupcion numero 2. Almacena codigo de tecla presionada en la direccion @=0x60(HEX ) Obtenemos codigo cuando se presiona tecla (bit 7=0)***************************************************************************************/unsigned char cod; /* Registro de almacen de codigo de tecla presionada*/

enable(); /* Activa flag de int en status register de CPU*/

/* Tratamiento de la tecla presionada---------------------------------------------*/cod=inportb(BASE_KEYBOARD); /* Captamos codigo de tecla pulsada*/switch(cod)

{case 30:{ /* Tecla [S]*/ if (intro==-3) intro=-5; break;}

case 19:{ /* Tecla [R]*/ if (intro==-1)

intro=-3; break;}

case 77:{ /* Tecla [->]*/ if (opcion==0) /* Entra si esta en entorno de configuracion*/

switch(intro){ /* "intro" marca la opcion de seleccion:

- (1) -> Seleccion de puerto - (2)-> Seleccion de velocidad*/

case 1:{ selection=selection|0x01; /* selection[0]=1*/ break;}

case 2:{ selection=selection|0x02; /* selection[1]=1*/ break;}

} if ((intro==0)&&(modem_conect==1)) /* Selecciona entorno*/ if (opcion<2)

opcion++; painted=0; /* Dibujar entorno seleccionado*/ break;}

case 75:{ /* Tecla [<-]*/ if (opcion==0) /* Entra si esta en entorno de configuracion*/

switch(intro){case 1:{ selection=selection&0x02; /* selection[0]=0*/

break;} case 2:{ selection=selection&0x01; /* selection[1]=0*/

break;}}

if ((intro==0)&&(modem_conect==1))if (opcion>0) /* Selecciona entorno*/

opcion--; painted=0; /* Dibujar entorno seleccionado*/ break;}

case 1:{ /* Tecla [ESC]*/if (auto_resp)

exit_auto_resp=0; /*Salida de modo autorespuesta*/if (intro==0) /* Si no hay entorno seleccionado*/

opcion=-2; /* Salida de programa principal*/

Page 74: Comunicación de dos ordenadores mediante el …deeea.urv.cat/public/PROPOSTES/pub/pdf/517pub.pdf · sistema de comunicaciones es captar señales digitales y modularlas para la emisión

7. ANEXO 1: ALGORITMO Comunicación de dos ordenadores con protocolo x-módem

72

if (opcion==0){if (intro>0) /* Rectifica seleccion anterior*/

intro--; if (intro==-1) /* Salida de opcion Marcar / Responder*/

intro=0;}

if (modem_conect==1)colgar_modem(); /* Libera la linea telefonica */

painted=0; /* Dibujar entorno seleccionado*/stop=0; /* Activa timer si esta parado*/break;}

case 28:{ /* Tecla [<-|] (enter)*/ if (intro>=0) /* Controla no encontrarse en una pregunta*/

intro++; /* Incrementa nivel de seleccion*/ painted=0; /* Dibujar entorno seleccionado*/ break;}

case 50:{// Tecla [M] if (intro==-1) /* Referente a cuestion Marcar/Responder*/

intro=-2; if (intro==-3) /* Referente a modo respuesta (manual/auto)*/

intro=-4;break;}

}eoi; /* Fin de interrupcion*/}

Page 75: Comunicación de dos ordenadores mediante el …deeea.urv.cat/public/PROPOSTES/pub/pdf/517pub.pdf · sistema de comunicaciones es captar señales digitales y modularlas para la emisión

7. ANEXO 1: ALGORITMO Comunicación de dos ordenadores con protocolo x-módem

73

void interrupt uart( __CPPARGS){/*************************************************************************************** Rutina de servicio de atencion a interrupcion de la UART (8250). Interrupcion de nivel 3 o 4 segun puerto seleccionado.***************************************************************************************/unsigned char identif, /* Registro que indentifica causa de interrupcion*/

m_status; /* Indica estado del modem*//*PROGRAMA*/enable(); /* Activa flag de int en status register de CPU*/identif=inportb(B_UART+2); /* Lectura IIR (Interrupt Indentification Reg.)*/switch(identif&0x06) /* Observacion de bits 1 – 2*/

{case 2:{ /* THR vacio (THRE)*/ data_trans=1; /* Indica dato transmitido*/ break;}

case 4:{ /* RBR lleno*/ data_recep=1; /* Indica dato recibido*/ break;}

case 0:{ /* MODEM STATUS*/ m_status=inportb(B_UART+6); /* Lectura MSR (Modem Status Reg.)*/ if (m_status&0x80)

modem_conect=1; /* DCD --> Portadora detectada*/ else

{modem_conect=0; /* Informa perdida de portadora*/ painted=0;} /* Informa dibujar entorno (conf.)*/

break;}}

/* Reset de interrupcion----------------------------*/inportb(B_UART+6); /* MSR -->RESET INT DEBIDO A MODEM STATUS*/inportb(B_UART+5); /* LSR -->RESET INT DEBIDO A OE,PE,FE o BI*/inportb(B_UART); /* RBR -->RESET INT DEBIDO A DATO RECIBIDO*/

eoi; /* Fin de Interrupcion*/}

Page 76: Comunicación de dos ordenadores mediante el …deeea.urv.cat/public/PROPOSTES/pub/pdf/517pub.pdf · sistema de comunicaciones es captar señales digitales y modularlas para la emisión

7. ANEXO 1: ALGORITMO Comunicación de dos ordenadores con protocolo x-módem

74

/******************** FUNCIONES DE INICIALIZACION DEL SISTEMA *********************/int ini_system(void){/*************************************************************************************** El objetivo de esta funcion es situar el sistema a un estado inicial apto para llevar a cabo el objetivo global del programa.***************************************************************************************/oldhandler_clk=getvect(VECT_CLOCK); /* Almacena direccion antigua subrutina atencion a int clock*/setvect(VECT_CLOCK,reloj); /* Asigna nueva direccion*/ini_kb(); /* Asigna nueva direccion subrutina antencion a int de teclado*/opengraph(); /* Inicializa la tarjeta de video*/return(0);}

void opengraph(void){ /* request auto detection */ int gdriver = DETECT, gmode, errorcode; int left, top, right, bottom;

/* initialize graphics and local variables */ initgraph(&gdriver, &gmode, "");

/* read result of initialization */ errorcode = graphresult(); if (errorcode != grOk) /* an error occurred */ { printf("Graphics error: %s\n", grapherrormsg(errorcode)); exit(1); /* terminate with an error code */ } setbkcolor(BLUE);}

void presentacion(void){/*************************************************************************************** OBJETIVO: Presentar el titulo, autor y director del proyecto durante 4 segundos.***************************************************************************************/int pres_x=getmaxx()/2-220, /* Cordenada X*/

pres_y=getmaxy()/3; /* Cordenada Y*/

/* Seleccion de colores---------------------------*/setbkcolor(BLUE); /* Selecciona color de fondo*/setcolor(WHITE); /* Selecciona color del texto*/setfillstyle(1,LIGHTGRAY); /* Selecciona color de la barra*/

/* Presenta informacion sobre el proyecto--------------------------------------------------*/clearviewport(); /* Lava screen*/moveto(pres_x,pres_y);outtext("P R O Y E C T O D E F I N A L D E C A R R E R A");moveto(pres_x,pres_y+20);outtext("COMUNICACION DE DOS ORDENADORES CON PROTOCOLO X-MODEM");outtextxy(pres_x+190,pres_y+200,"Autor: Luis Enciso Morales");outtextxy(pres_x+190,pres_y+215,"Director: Esteban del Castillo");reset_timer();while (seg<5) /* Dibuja barra expandiendose segun tiempo transcurrido*/

bar(pres_x,2*pres_y-20,pres_x+107*seg,2*pres_y-17);}

Page 77: Comunicación de dos ordenadores mediante el …deeea.urv.cat/public/PROPOSTES/pub/pdf/517pub.pdf · sistema de comunicaciones es captar señales digitales y modularlas para la emisión

7. ANEXO 1: ALGORITMO Comunicación de dos ordenadores con protocolo x-módem

75

void ini_kb(void){/*************************************************************************************** Funcion que tiene el objetivo de asignar la direccion asociada a nuestra subrutina de atencion a la interrupcion del teclado.***************************************************************************************/oldhandler_kb=getvect(VECT_KEYBOARD); /* Almacena direccion de antigua subrutina*/setvect(VECT_KEYBOARD,teclado); /* Asigna direc nueva subrutina*/}

int ini_ls(unsigned int speed){/*************************************************************************************** El objetivo de la presente funcion es inicializar la UART 8250 para situarla en estado apto para la transmision de datos con otro equipo. Se configura a la velocidad indicada por la variable de entrada "speed".***************************************************************************************/outportb(0x21,inportb(0x21)|0x18);/*Inhibimos INT 3 Y 4*/outportb(B_UART+3,0x80); /* LCR -- PARA INSERTAR EN LSB Y DLB */

/* Seleccion de velocidad-------------------------------*/outportb(B_UART,speed&0xFF); /* LSB*/outportb(B_UART+1,(speed>>8)&0xFF); /* MSB*/

/* Formato de palabra de datos-------------------------------------*/outportb(B_UART+3,0x03); /* LCR -- ASIGNACION VALORES POR DEFECTO

WORD = 8 bit STOP BIT = 1

SIN PARIDAD*/

/* IER-Activa motivos de peticion de interrupcion------------------------------------------------------------*/outportb(B_UART+1,0x0B); /*-THR vacio

-RBR lleno -cambio estado modem*/

/* MCR - Valores para conexion---------------------------------------*/outportb(B_UART+4,0x0B); /* -DTR -->Indica todo listo

-OUT2*/

/* Activacion de bit de permiso de interrupcion---------------------------------------------------------*/disable(); /* No permite interrupciones*/if (B_UART==0x03F8)

outportb(0x21,inportb(0x21)&0xEF); /* ACTIVAMOS INT NIVEL 4*/else

outportb(0x21,inportb(0x21)&0xF7); /* ACTIVAMOS INT NIVEL 3*/enable(); /* Permite interrupciones*/

/* RESET de posibles causas de INT--------------------------------------------*/inportb(B_UART+6); /* MSR*/inportb(B_UART+5); /* LSR*/inportb(B_UART+2); /* IIR*/inportb(B_UART); /* RBR*/

return(0);}

Page 78: Comunicación de dos ordenadores mediante el …deeea.urv.cat/public/PROPOSTES/pub/pdf/517pub.pdf · sistema de comunicaciones es captar señales digitales y modularlas para la emisión

7. ANEXO 1: ALGORITMO Comunicación de dos ordenadores con protocolo x-módem

76

int ini_modem(void){/************************************************************************************** Funcion que tiene la mision de iniciar el modem a un estado faborable para la conexion. Informa de la conexion correcta del modem al DTE basandose en la activacion de la señal DSR. Debido a la existencia de modems que no disponen de esa señal, siempre realiza la inicializacion.***************************************************************************************/data_trans=1; /* Para enviar el primer dato*/

/*Emision de comandos de inicializacion-------------------------------------------------*/if (manda_dato('A')==-1) /* Emision de AT&F0V0S0=0S9=20S7=9*/

return(-1);if (manda_dato('T')==-1)

return(-1);if (manda_dato('&')==-1) /* &F0 -> Reconfigura modem con opciones predefinidas de fabrica*/

return(-1);if (manda_dato('F')==-1)

return(-1);if (manda_dato('0')==-1)

return(-1);if (manda_dato('V')==-1) /* V0 -> Respuesta de los comandos en codigos numericos*/

return(-1);if (manda_dato('0')==-1)

return(-1);if (manda_dato('S')==-1) /* S0=0 -> Anula respuesta Automatica*/

return(-1);if (manda_dato('0')==-1)

return(-1);if (manda_dato('=')==-1)

return(-1);if (manda_dato('0')==-1)

return(-1);if (manda_dato('S')==-1) /* S9=20 -> Tiempo de respuesta al detectar portadora (2seg)*/

return(-1);if (manda_dato('9')==-1)

return(-1);if (manda_dato('=')==-1)

return(-1);if (manda_dato('2')==-1)

return(-1);if (manda_dato('0')==-1)

return(-1);if (manda_dato('S')==-1) /* S7=9 -> Tiempo de espera de la portadora remota (9seg)*/

return(-1);if (manda_dato('7')==-1)

return(-1);if (manda_dato('=')==-1)

return(-1);if (manda_dato('9')==-1)

return(-1);if (manda_dato(CR)==-1) /* Emision de ENTER*/

return(-1);pausa_seg(2); /* Da tiempo al modem (2seg)*/

/* Observa si el modem esta conectado al equipo-------------------------------------------------------*/if ((inportb(B_UART+6)&0x20)==0) /* MSR--> DSR==1?*/

return(1);return(0);}

Page 79: Comunicación de dos ordenadores mediante el …deeea.urv.cat/public/PROPOSTES/pub/pdf/517pub.pdf · sistema de comunicaciones es captar señales digitales y modularlas para la emisión

7. ANEXO 1: ALGORITMO Comunicación de dos ordenadores con protocolo x-módem

77

/********************* FUNCIONES DE CONVERSION DE DATOS **************************/int convert_num_car(unsigned char r_num[132],int num_blk){/*************************************************************************************** OBJETIVO: Convertir un valor numerico a una cadena de caracteres con formato XMODEM.***************************************************************************************/int conta_rn=3, /* Indice de la cadena de caracteres*/

resto; /* Resto de la division*/

/* Asignacion de caracteres de control----------------------------------------------*/r_num[0]=SOH;r_num[1]=1;r_num[2]=0xFE;

/* Conversion del valor----------------------------*/while (num_blk>9)

{resto=num_blk%10; num_blk=num_blk/10; r_num[conta_rn]=resto+48; conta_rn++;}

r_num[conta_rn]=num_blk+48;for (conta_rn=conta_rn+1;conta_rn<=130;conta_rn++)

r_num[conta_rn]=0x00;

r_num[131]=chk_sum(r_num); /* Realiza checksum de cadena de carateres*/return(0);}

int convert_car_num(unsigned char nmr[132]){/*************************************************************************************** Funcion que tiene la mision de convertir una cadena de caracteres en formato XMODEM a un valor numerico.***************************************************************************************/int aux_cn;int result_convert=0;for(aux_cn=7;aux_cn>2;aux_cn--)

if (nmr[aux_cn]!=0)result_convert=result_convert+pow10(aux_cn-3)*(nmr[aux_cn]-48);

return(result_convert);}

Page 80: Comunicación de dos ordenadores mediante el …deeea.urv.cat/public/PROPOSTES/pub/pdf/517pub.pdf · sistema de comunicaciones es captar señales digitales y modularlas para la emisión

7. ANEXO 1: ALGORITMO Comunicación de dos ordenadores con protocolo x-módem

78

/****************** FUNCIONES RELACIONADAS CON LOS ENTORNOS ********************/void win_setup(defmenu menu3[3]){/*************************************************************************************** OBJETIVO: Establecer la pagina de Configuracion.***************************************************************************************/int aux_win_setup, /* Variable auxiliar para dibujar entorno*/

yw, /* Determina coordenada Y de mensajes*/flag_error=0; /* Indica error de linea serie o modem*/

int sm; /* "speed modem" (velocidad MODEM)*/char inf_modem[100], /* Registro almacen de modelo y marca del MODEM*/

numero_t[15]; /* Numero de telefono a marcar*/

/* Establecimiento de entorno y enunciados----------------------------------------------------*/clearviewport(); /* Borra el contenido del screen*/for(aux_win_setup=-1;aux_win_setup<=0;aux_win_setup++)

{pinta_entorno(aux_win_setup); /* Entorno de Configuracion*/pinta_menu(menu3,aux_win_setup); /* Enunciados de Configuracion*/}

/* Dibuja el cuadro de seleccion en barra tareas (amarillo)*/pinta_cuadro(menu3[0].x+2*SEP,menu3[0].y,menu3[0].title,0);while ((intro>0)) /* Entra si se pulsa ENTER*/

{ if (painted==0) /* Pinta si la variable global lo permite*/

{ /* Dibuja cuadro seleccion en barra tareas (rojo)*/ pinta_cuadro(menu3[0].x+2*SEP,menu3[0].y,menu3[0].title,1); switch(intro) /* Segun el valor de intro, habra un color u otro*/

{case 1:{pinta_circle(YELLOW,LIGHTGRAY);break;}case 2:{pinta_circle(RED,YELLOW);break;}case 3:{pinta_circle(RED,RED);

intro=-1; /* Indica fin de seleccion opciones*/break;}

} painted=1; /* Indica que ya ha pintado*/ }

}

/* Asignacion de direcciones y vectores de interrupcion-------------------------------------------------------------------*/yw=INI_SCR_SETUP_y;if (intro==-1) /* Entra si termino seleccion de opciones*/

{ if ((selection&0x01)==0)

{B_UART=0x03F8; /* @ base UART memoria E/S (com1)*/ VECT_LS=0x0C; /* @ de la @ de la rutina atencion int

(com1)*/ escribe_mensaje(INI_SCR_SETUP_x,&yw,INI_SCR_SETUP_y,

FIN_LINE_SE,"Puerto seleccionado COM 1... ");}

else{B_UART=0x02F8; /* @ base UART memoria E/S (com2)*/ VECT_LS=0x0B; /* @ de la @ de la rutina atencion int

(com2)*/escribe_mensaje(INI_SCR_SETUP_x,&yw,INI_SCR_SETUP_y,

FIN_LINE_SE,"Puerto seleccionado COM 2... ");}

Page 81: Comunicación de dos ordenadores mediante el …deeea.urv.cat/public/PROPOSTES/pub/pdf/517pub.pdf · sistema de comunicaciones es captar señales digitales y modularlas para la emisión

7. ANEXO 1: ALGORITMO Comunicación de dos ordenadores con protocolo x-módem

79

oldhandler_ls=getvect(VECT_LS); /* Almacen direccion antigua rutina*/setvect(VECT_LS,uart); /* Asignacion de direccion de nueva rutina*//* Inicializacion del sistema de comuniciones------------------------------------------------------*/if (ini_ls(96)!=1) /* Inicializa linea serie a 1200 baudios*/

switch(ini_modem()) /* Inicializa Modem*/{ /*Da codigo segun transcurso inicializacion*/ case 1:{ /* No detecta modem. Unicamente informa*/

escribe_mensaje(INI_SCR_SETUP_x,&yw,INI_SCR_SETUP_y,FIN_LINE_SE,"Señal DSR no detectada...");

break;} case -1:{ /* Activacion de TimeOut*/

escribe_mensaje(INI_SCR_SETUP_x,&yw,INI_SCR_SETUP_y,FIN_LINE_SE,"Error en la inicializacion del modem.");

flag_error=1; /* Salida inminente debido a error*/break;} case 0:{ /* Inicializacion correcta*/

escribe_mensaje(INI_SCR_SETUP_x,&yw,INI_SCR_SETUP_y,FIN_LINE_SE,"Inicializacion del Modem correcta...");

break;}}

elseflag_error=1; /* Indica error existente (Debido a la linea serie)*/

/* Determinacion de la velocidad del modem------------------------------------------------------*/if (!flag_error) /* Inicializacion correcta*/

{if ((selection&0x02)==0) /* Si seleccion de velocidad AUTOMATICO*/

{ escribe_mensaje(INI_SCR_SETUP_x,&yw,INI_SCR_SETUP_y,FIN_LINE_SE,

"AUTOAJUSTE DE VELOCIDAD DEL SISTEMA...");sm=get_speed_auto(); /* Obtiene Divisor para maxima velocidad:

Baud Rate = (Frecuency Input)/(16*Divisor)*/if (sm==-1) /* No deteccion de velocidad*/

{ escribe_mensaje(INI_SCR_SETUP_x,&yw,INI_SCR_SETUP_y,

FIN_LINE_SE,"ERROR... SELECCION MANUAL."); selection=selection|0x02; /* Seleccion MANUAL*/

pinta_circle(LIGHTGRAY,RED); /* Pinta nueva seleccion*/}

else{

escribe_mensaje(INI_SCR_SETUP_x,&yw,INI_SCR_SETUP_y,FIN_LINE_SE,"VELOCIDAD MAXIMA:");

gotoxy(INI_SCR_SETUP_x+19,yw); printf("%d baudios",115200/sm); /* Frecuency input=1843200Hz

(1843200/16=115200)*/ pausa_seg(2); /*Para visualizar mensajes pantalla */ }

}if ((selection&0x02)==0x02) /* Seleccion MANUAL de velocidad*/

{sm=get_speed_manual(); /* Determina velocidad modem

manualmente*/escribe_mensaje(INI_SCR_SETUP_x,&yw,INI_SCR_SETUP_y,FIN_LINE_SE,

"Velocidad establecida.");}

ini_ls(sm); /* Inicializa linea serie a velocidad modem*/

Page 82: Comunicación de dos ordenadores mediante el …deeea.urv.cat/public/PROPOSTES/pub/pdf/517pub.pdf · sistema de comunicaciones es captar señales digitales y modularlas para la emisión

7. ANEXO 1: ALGORITMO Comunicación de dos ordenadores con protocolo x-módem

80

/* Impresion de datos informativos del modem--------------------------------------------------------*/escribe_mensaje(11,&yw,INI_SCR_SETUP_y,FIN_LINE_SE,

"Obtieniendo informacion del modem...");for (aux_win_setup=0;aux_win_setup<100;aux_win_setup++)

inf_modem[aux_win_setup]=' '; /* Limpia registro de informacion*/if (get_data_modem(inf_modem)==-1) /* Obtiene marca y modelo modem*/

escribe_mensaje(11,&yw,INI_SCR_SETUP_y,FIN_LINE_SE,"Datos de modem no obtenidos...");

elseescribe_inf_modem(inf_modem); /* Escribe informacion del

MODEM*/

/* Establecimiento de conexion--------------------------------------*/paint_message("MARCAR LLAMADA [M] / RESPONDER LLAMADA [R]");while (intro==-1); /* Espera hasta seleccion de opcion

(vease rutina atencion del teclado)*/switch(intro)

{case -2:{ /* Seleccion MARCARLLAMADA*/

get_tel_number(numero_t); /* Obtiene numero de telefono*/ if (marca_tel(numero_t)==-1) /* Marca numero*/

paint_message("Error al marcar... "); intro=0; /* Vuelve a nivel 0*/ break;}

case -3:{ /* SeleccionRESPONDER*/

paint_message("MANUAL [M] / AUTOMATICA [A]"); while (intro==-3); /* Espera hasta seleccion de opcion*/

if (intro==-4){ /* MANUAL*/paint_message("Respondiendo llamada...");

if (resp_llam()==-1)paint_message("Error al responder... ");

intro=0; /* Vuelve a nivel 0*/ } if (intro==-5)

{ /* AUTOMATICA*/auto_resp=1; /* Indica autorespuesta*/if (conf_mod_auto_r()==0) /* Modem en

autorespuesta*/{ /* Si no hay error*/opcion=1; /* Entorno Envia_fichero*/intro=1; /* Seleccionado*/painted=0; /* Pintar de nuevo*/}

} break;}}

} /* Fin de if (!flag_error)*/} /* Fin de if (intro==-1)*/

/* Dibuja cuadro seleccion barra tareas (amarillo)*/pinta_cuadro(menu3[0].x+2*SEP,menu3[0].y,menu3[0].title,0); pinta_circle(LIGHTGRAY,LIGHTGRAY);}

Page 83: Comunicación de dos ordenadores mediante el …deeea.urv.cat/public/PROPOSTES/pub/pdf/517pub.pdf · sistema de comunicaciones es captar señales digitales y modularlas para la emisión

7. ANEXO 1: ALGORITMO Comunicación de dos ordenadores con protocolo x-módem

81

int win_send_file(defmenu menu4[3]){/*************************************************************************************** Funcion que tiene el objetivo de establecer el entorno de Envia_fichero.***************************************************************************************/int sy=INI_SCR_SR_y, /* Cord. Y para escribir mensaje*/

sx=INI_SCR_SR_x; /* Cord. X para escribir mensaje*/char result; /* Byte indica resultado envio fichero*/int fin=0, /* Indica el momento de salir de entorno*/

ntb, /* Numero total de bloques a transmitir*/FILE file; /* Puntero a fichero*/static char n_file[38]; /* String que guarda el nombre del fichero*/int aux_win_send_f; /* Var aux dibujar entorno y cargar datos*/int aux_auto; /* Permite entrar entorno 1 vez (autoresp)*/

/* Establecimiento del entorno y enunciados-----------------------------------------------------*/clearviewport(); /* Limpia screen*/aux_auto=auto_resp;exit_auto_resp=1;for(aux_win_send_f=-1;aux_win_send_f<=2;aux_win_send_f+=2)

{ pinta_entorno(aux_win_send_f); /* Entorno de emision de ficheros*/ pinta_menu(menu4,aux_win_send_f); /* Enunciados de emision de ficheros*/}

if (intro>0) /* Entra en entorno*/{ /* Determinacion de fichero a transmitir ------------------------------------------------*/

/* Dibuja cuadro seleccion barra tareas (rojo)*/pinta_cuadro(menu4[1].x,menu4[1].y,menu4[1].title,1);escribe_mensaje(sx,&sy,INI_SCR_SR_y,FIN_LINE_SR,"Nombre del fichero a transmitir... ");setfillstyle(1,RED); /* Asigna color barra nombre fichero*/fin_kb(); /* Asigna direccion antigua subrutina teclado*/ntb=NULL; /* Desconoce numero total de bloques

enviar*/while (((ntb==NULL)&&(modem_conect))||(aux_auto))

{ aux_auto=0; /* Entra una vez debido a autorespuesta*/ get_name_file(n_file,menu4); /* Obtiene nombre de fichero a transmitir*/ ntb=cuenta_bloques(n_file); /* Cuenta bloques del fichero*/ if (ntb==NULL) /* Si no existe fichero devuelve NULL*/

{ escribe_mensaje(sx,&sy,INI_SCR_SR_y,FIN_LINE_SR,

"No se ha encontrado el fichero."); aux_auto=auto_resp; /* Introducir otro nombre de fichero*/}

}

/* Transmision de fichero------------------------------*/file=fopen(n_file,"r");setfillstyle(1,GREEN); /* Asigna color de la barra de proceso*/bar(B_PRSx,B_PRSy,B_PRSx+W_PRS,B_PRSy+H_PRS);ini_kb(); /* Asigna direccion nueva subrutina teclado*/setfillstyle(1,LIGHTGRAY); /* Asigna color barra nombre fichero*/setcolor(WHITE); /* Asigna color letras enunciado fichero*/bar(menu4[1].menu[0].pos_x+ANCHO/2,menu4[1].menu[0].pos_y,

menu4[1].menu[0].pos_x+2*ANCHO,menu4[1].menu[0].pos_y+textheight(""));

Page 84: Comunicación de dos ordenadores mediante el …deeea.urv.cat/public/PROPOSTES/pub/pdf/517pub.pdf · sistema de comunicaciones es captar señales digitales y modularlas para la emisión

7. ANEXO 1: ALGORITMO Comunicación de dos ordenadores con protocolo x-módem

82

outtextxy(menu4[1].menu[0].pos_x+110,menu4[1].menu[0].pos_y,n_file);escribe_mensaje(sx,&sy,INI_SCR_SR_y,FIN_LINE_SR,"Fichero:");escribe_mensaje(sx,&sy,INI_SCR_SR_y,FIN_LINE_SR,n_file);result=' ';data_recep=0;fin=-1;escribe_mensaje(sx,&sy,INI_SCR_SR_y,FIN_LINE_SR,"Esperando señal del receptor... ");if (auto_resp==1)

{ stop=1; /* Para el contador timer*/ reset_timer(); /* Resetea el contador*/}

while ((result!=NAK)&&(exit_auto_resp)) /* Lee dato entrada hasta recibir NAK */fin=recibe_dato(&result);

stop=0; /* Activa contador timer*/if ((result==NAK)&&(modem_conect))

{ escribe_mensaje(sx,&sy,INI_SCR_SR_y,FIN_LINE_SR,"Receptor preparado..."); switch (send_file(file,ntb)) /* Envia fichero y devuelve codigo resultado proceso*/

{case 0:{escribe_mensaje(sx,&sy,INI_SCR_SR_y,FIN_LINE_SR,

"Fichero transmitido correctamente. "); break;}

case -1:{escribe_mensaje(sx,&sy,INI_SCR_SR_y,FIN_LINE_SR,

"CANCEL recibido.Finaliza transmision."); break;}

case -2:{escribe_mensaje(sx,&sy,INI_SCR_SR_y,FIN_LINE_SR,

"Numero de intentos superado"); break;}

case -3:{escribe_mensaje(sx,&sy,INI_SCR_SR_y,FIN_LINE_SR,

"No se ha podido transmitir EOT. "); break;}

case -4:{escribe_mensaje(sx,&sy,INI_SCR_SR_y,FIN_LINE_SR,

"Receptor no reconoce EOT."); break;}

} escribe_mensaje(sx,&sy,INI_SCR_SR_y,FIN_LINE_SR,

"Fin de transmision de archivo. ");}

else /* Caso que no recibaNAK*/

escribe_mensaje(sx,&sy,INI_SCR_SR_y,FIN_LINE_SR,"Receptor no preparado... ");} /* Fin de if (intro>0)*/

/* Finalizacion de entorno-------------------------------*/

/* Dibuja cuadro seleccion en barra tareas (amarillo)*/pinta_cuadro(menu4[1].x,menu4[1].y,menu4[1].title,0);intro=0; /* Se situa en el nivel 0*/return(0);}

Page 85: Comunicación de dos ordenadores mediante el …deeea.urv.cat/public/PROPOSTES/pub/pdf/517pub.pdf · sistema de comunicaciones es captar señales digitales y modularlas para la emisión

7. ANEXO 1: ALGORITMO Comunicación de dos ordenadores con protocolo x-módem

83

void win_rece_file(defmenu menu5[3]){/************************************************************************************** OBJETIVO: Establecer el entorno de Recibe_fichero. VARIABLES DE ENTRADA:

.-menu5[3] -> Registro cargado con contenido de los enunciados de todo el entorno.***************************************************************************************/int aux_win_rece_f; /* Variable auxiliar ayuda dibujar entorno*/static char n_file_r[38]; /* String que guarda nombre del fichero*/

/* Establecimiento del entorno y enunciados-----------------------------------------------------*/clearviewport();strcpy(n_file_r," "); /* Limpia string*/for(aux_win_rece_f=-1;aux_win_rece_f<=2;aux_win_rece_f+=3)

{pinta_entorno(aux_win_rece_f); /* Entorno de recepcion de ficheros*/pinta_menu(menu5,aux_win_rece_f); /* Enunciados de recepsion de ficheros*/}

if (intro>0) /* Entra en entorno*/{/* Determinacion del fichero a recibir---------------------------------------------*/aux_win_rece_f=INI_SCR_SR_y;

/* Dibuja cuadro seleccion en barra tareas (rojo)*/pinta_cuadro(menu5[2].x,menu5[2].y,menu5[2].title,1);escribe_mensaje(INI_SCR_SR_x,&aux_win_rece_f,INI_SCR_SR_y,FIN_LINE_SR,

"Nombre del fichero a transmitir... ");setfillstyle(1,RED); /* Asigna color barra nombre fichero*/aux_win_rece_f=0;fin_kb(); /* Asigna direccion antigua subrutina teclado*/bar(menu5[2].menu[0].pos_x+ANCHO/2,menu5[2].menu[0].pos_y,

menu5[2].menu[0].pos_x+2*ANCHO,menu5[2].menu[0].pos_y+textheight(""));get_name_file(n_file_r,menu5); /* Nombre fichero a recibir*/ini_kb(); /* Asigna direccion nueva subrutina teclado*/setfillstyle(1,LIGHTGRAY); /* Asigna color barra nombre fichero*/setcolor(WHITE); /* Asigna color letra nombre fichero*/bar(menu5[2].menu[0].pos_x+ANCHO/2,menu5[2].menu[0].pos_y,

menu5[2].menu[0].pos_x+2*ANCHO,menu5[2].menu[0].pos_y+textheight(""));outtextxy(menu5[2].menu[0].pos_x+110,menu5[2].menu[0].pos_y,n_file_r);

/* Recepcion y almacenaje del fichero----------------------------------------------*/recep_file(n_file_r); /* Dispone de mensajes de error

internamente*/

/* Finalizacion de entorno-------------------------------*/

/* Dibuja cuadro seleccion en barra tareas (amarillo)*/pinta_cuadro(menu5[2].x,menu5[2].y,menu5[2].title,0);intro=0;}

}

Page 86: Comunicación de dos ordenadores mediante el …deeea.urv.cat/public/PROPOSTES/pub/pdf/517pub.pdf · sistema de comunicaciones es captar señales digitales y modularlas para la emisión

7. ANEXO 1: ALGORITMO Comunicación de dos ordenadores con protocolo x-módem

84

void carga_menu(defmenu menu1[3]){/*************************************************************************************** OBJETIVO: Realizar la carga de los diferentes registros que contienen los enunciados de los diferentes entornos del programa, ademas de las coordenadas de ubicacion de cada uno. VARIABLES ENTRADA:

- menu1[3] -> Registro de carga del contenido de los enunciados de todo el entorno.***************************************************************************************/int aux_carga, /* Variables auxiliares para facilitar la carga de los registros*/

aux_carga1;

/* Carga de los enunciados del entorno de Configuracion--------------------------------------------------------------------*/strcpy(menu1[0].title," Configurar "); /* Carga enunciados de la barra inferior*/strcpy(menu1[1].title," Envia_fichero ");strcpy(menu1[2].title," Recibe_fichero ");for(aux_carga=0;aux_carga<=2;aux_carga++)

{menu1[aux_carga].x=aux_carga*STEXT; /* Coordenada X*/ menu1[aux_carga].y=getmaxy()-10*SEP;} /* Coordenada Y*/

strcpy(menu1[0].menu[0].nombre,"PUERTO "); /* Carga datos de entorno Configuracion*/strcpy(menu1[0].menu[1].nombre," com_1 ");strcpy(menu1[0].menu[2].nombre," com_2 ");strcpy(menu1[0].menu[3].nombre,"VELOCIDAD ");strcpy(menu1[0].menu[4].nombre," Auto ");strcpy(menu1[0].menu[5].nombre," Manual ");strcpy(menu1[0].menu[6].nombre," bps ");

/* Carga de coordenadas X de posicion de los enunciados del entorno Configuracion-----------------------------------------------------------------------------------------------------*/for (aux_carga=0;aux_carga<=3;aux_carga=aux_carga+3) /* Puerto y velocidad*/

menu1[0].menu[aux_carga].pos_x=70;for (aux_carga=1;aux_carga<=4;aux_carga=aux_carga+3) /* com_1 y Auto*/

menu1[0].menu[aux_carga].pos_x=menu1[0].menu[0].pos_x+30;for (aux_carga=2;aux_carga<=5;aux_carga=aux_carga+3) // com_2 y Manual

menu1[0].menu[aux_carga].pos_x=menu1[0].menu[1].pos_x+300;menu1[0].menu[6].pos_x=menu1[0].menu[2].pos_x+150; /* bps*/

/* Carga de coordenadas Y de posicion de los enunciados del entorno Configuracion-----------------------------------------------------------------------------------------------------*/menu1[0].menu[0].pos_y=getmaxy()/2; /* Puerto*/menu1[0].menu[3].pos_y=getmaxy()/2+menu1[0].menu[0].pos_y/2; /* Velocidad*/for (aux_carga=4;aux_carga<=6;aux_carga++) /* Auto, Manual y bps*/ menu1[0].menu[aux_carga].pos_y=getmaxy()/2+menu1[0].menu[3].pos_y/2;for (aux_carga=1;aux_carga<=2;aux_carga++) /* com_1 y com_2*/

menu1[0].menu[aux_carga].pos_y=getmaxy()/2+(menu1[0].menu[3].pos_y -menu1[0].menu[0].pos_y)/2;

/* Carga de los enunciados del entorno de Enviar_fichero y Recibir_fichero------------------------------------------------------------------------------------------*/for (aux_carga=1;aux_carga<=2;aux_carga++)

{strcpy(menu1[aux_carga].menu[0].nombre," FICHERO: "); strcpy(menu1[aux_carga].menu[1].nombre," PROCESO "); strcpy(menu1[aux_carga].menu[2].nombre,"SEGUIMIENTO "); strcpy(menu1[aux_carga].menu[3].nombre," 100 % "); strcpy(menu1[aux_carga].menu[4].nombre," 50 % "); strcpy(menu1[aux_carga].menu[5].nombre," 0 % "); strcpy(menu1[aux_carga].menu[6].nombre," ");

Page 87: Comunicación de dos ordenadores mediante el …deeea.urv.cat/public/PROPOSTES/pub/pdf/517pub.pdf · sistema de comunicaciones es captar señales digitales y modularlas para la emisión

7. ANEXO 1: ALGORITMO Comunicación de dos ordenadores con protocolo x-módem

85

/*Coordenada X de entorno Enviar_fichero y Recibir_fichero-------------------------------------------------------------------------*/

menu1[aux_carga].menu[0].pos_x=20; /* Fichero*/menu1[aux_carga].menu[1].pos_x=80; /* Proceso*/menu1[aux_carga].menu[2].pos_x=menu1[aux_carga].menu[1].pos_x+125;for (aux_carga1=3;aux_carga1<=5;aux_carga1++)

menu1[aux_carga].menu[aux_carga1].pos_x=10;menu1[aux_carga].menu[6].pos_x=getmaxx(); /* 100 %, 50 % y 0 %*/

/*Coordenada Y de entorno Enviar_fichero y Recibir_fichero-------------------------------------------------------------------------*/

menu1[aux_carga].menu[0].pos_y=40; /* Fichero*/for (aux_carga1=1;aux_carga1<=2;aux_carga1++) /* Proceso, Seguimiento*/

menu1[aux_carga].menu[aux_carga1].pos_y=80; menu1[aux_carga].menu[3].pos_y=menu1[aux_carga].menu[2].pos_y+20; /* 100 %*/ menu1[aux_carga].menu[5].pos_y=4*menu1[aux_carga].menu[3].pos_y; /* 0 %*/ menu1[aux_carga].menu[4].pos_y=((menu1[aux_carga].menu[5].pos_y- menu1[aux_carga].menu[3].pos_y)/2)+menu1[aux_carga].menu[3].pos_y; /*50%*/ menu1[aux_carga].menu[6].pos_y=getmaxy(); }

}

Page 88: Comunicación de dos ordenadores mediante el …deeea.urv.cat/public/PROPOSTES/pub/pdf/517pub.pdf · sistema de comunicaciones es captar señales digitales y modularlas para la emisión

7. ANEXO 1: ALGORITMO Comunicación de dos ordenadores con protocolo x-módem

86

void pinta_entorno(int num_entorn){/*************************************************************************************** OBJETIVO: Dibujar entorno indicado por la variable de entrada. VARIABLES ENTRADA:

- num_entorn. Tiene en cuenta la sigueinte codificacion:* 0 : Entorno de Configuracion

* 1 : Entorno de Envia_fichero* 2 : Entorno de Recibe_fichero* -1 : Barra inferior de tareas

***************************************************************************************/

/* Presentacion formato general--------------------------------------*/setcolor(WHITE); /* Seleccion color de lineas*/rectangle(0,0,getmaxx(),getmaxy()); /* Dibuja rectangulo con doble linea*/rectangle(SEP,SEP,getmaxx()-SEP,getmaxy()-SEP);

/* Impresion de entorno seleccionado--------------------------------------------*/switch(num_entorn)

{case 0:{ /* Entorno de Configuracion*/ rectangle(70,40,550,200); circle(C_X0,C_Y0,RADIO+SEP); circle(C_X0,C_Y1,RADIO+SEP); circle(C_X1,C_Y0,RADIO+SEP); circle(C_X1,C_Y1,RADIO+SEP);

rectangle(C_X1+95,C_Y1-textheight(""),C_X1+155,C_Y1+textheight(""));

outtextxy(180,358,"(1200, 2400, 4800, 9600, 19200 bps)"); break;}

case -1:{ /* Barra inferior de tareas*/ setfillstyle(1,LIGHTGRAY); bar(2*SEP,getmaxy()-HBT,getmaxx()-2*SEP,getmaxy()-2*SEP); break;}

default:{ /* Entornos Envia_fichero y Recibe_fichero*/ if ((num_entorn==1)||(num_entorn==2))

{rectangle(205,100,580,400); rectangle(B_PRSx-SEP,B_PRSy-

SEP,B_PRSx+W_PRS+SEP,B_PRSy+H_PRS+SEP);} break;}

}}

Page 89: Comunicación de dos ordenadores mediante el …deeea.urv.cat/public/PROPOSTES/pub/pdf/517pub.pdf · sistema de comunicaciones es captar señales digitales y modularlas para la emisión

7. ANEXO 1: ALGORITMO Comunicación de dos ordenadores con protocolo x-módem

87

void pinta_menu(defmenu menu2[3],int num_menu){/*************************************************************************************** OBJETIVO: Escribir los enunciados del entorno seleccionado por la variable de entrada. VARIABLES ENTRADA:

- menu2[3] –> Registro de carga del contenido de los enunciados de todo el entorno.- num_entorn -> Tiene en cuenta la sigueinte codificacion:

* 0 : Entorno de Configuracion * 1 : Entorno de Envia_fichero* 2 : Entorno de Recibe_fichero* -1 : Barra inferior de tareas

***************************************************************************************/int aux_pinta; /* Variable auxiliar para escribir enunciados*/

/* Impresion del entorno-----------------------------*/if (num_menu==-1)

{ /* Imprime enunciados de la barra inferior de tareas*/setcolor(RED); /* Selecciona color de la letra Rojo*/for (aux_pinta=0;aux_pinta<=3;aux_pinta++)

{ /* Escribe los enunciados segun coordenadas prestablecidas*/ moveto(menu2[aux_pinta].x,menu2[aux_pinta].y); outtext(menu2[aux_pinta].title);}

}else

for (aux_pinta=0;aux_pinta<=6;aux_pinta++){ /* Imprime enunciados del entorno seleccionado*/setcolor(YELLOW);moveto(menu2[num_menu].menu[aux_pinta].pos_x,

menu2[num_menu].menu[aux_pinta].pos_y);outtext(menu2[num_menu].menu[aux_pinta].nombre);

}}

void pinta_cuadro(int c_x,int c_y,char name[18],int select){/*************************************************************************************** OBJETIVO: Pintar el cuadro de seleccion en la barra inferior de tareas. VARIABLES ENTRADA:

- c_x, c_y -> Coordenadas de posicion del cuadro de selección.- name[18] -> Cotiene el nombre que se incluye en el interior del cuadro.- select -> Cuadro seleccionado / no seleccionado. (Varia color)

***************************************************************************************/

switch (select){case 0:{/* Caso seleccion sin entrar en entorno*/

setfillstyle(1,YELLOW); setcolor(BLUE); break;}

case 1:{/* Caso seleccion entrando en entorno*/ setfillstyle(1,RED); setcolor(WHITE); break;}

}bar(c_x,c_y-H_FRM/2,c_x+W_FRM,c_y+H_FRM/2+textheight(""));outtextxy(c_x,c_y,name);}

Page 90: Comunicación de dos ordenadores mediante el …deeea.urv.cat/public/PROPOSTES/pub/pdf/517pub.pdf · sistema de comunicaciones es captar señales digitales y modularlas para la emisión

7. ANEXO 1: ALGORITMO Comunicación de dos ordenadores con protocolo x-módem

88

void escribe_mensaje(int xx,int *yy,int line_s,int line_i,char texto[38]){/***************************************************************************************OBJETIVO: Imprimir en pantalla el registro de caracteres portados dentro de la variable "texto" en la

ubicacion asignada por "xx" e "yy" entre los valores ""line_s" y "line_i" de la coordenada y.VARIABLES ENTRADA:

- xx, yy -> Coordenadas de posicion del mensaje.- line_s, line_i -> Acotacion de posicion de mensaje en pantalla.- texto[38] -> Registro de caracteres a imprimir.

SALIDA:- yy -> Se incrementa en una unidad.

***************************************************************************************/

/* Establece posicion del mensaje----------------------------------------*/*yy=*yy+1; /* Para evitar escribir en la misma linea anterior*/if (*yy>line_i) /* Controla la coordenada Y de la zona mensajes*/

{setfillstyle(1,BLUE); bar(205+SEP,100+SEP,580-SEP,400-SEP); *yy=line_s; /* Para no sobresalir del area de impresion*/}

gotoxy(xx,*yy);

/* Imprime registro de caracteres---------------------------------------*/puts(texto);}

void paint_message(char mensaje[N_CHAR_M]){/*************************************************************************************** OBJETIVO: Escribir un mensaje de N_CHAR_M caracteres sobre un recuadro de color rojo y contorno

blanco. VARIABLES ENTRADA:

- mensaje[N_CHAR_M] -> Registro de caracteres a imprimir.***************************************************************************************/int f_x3, /* Coordenada X centro cuadro*/

f_y3; /* Coordenada Y centro cuadro*/

/* Asignacion de parametros previos-------------------------------------------*/f_x3=getmaxx()/2;f_y3=getmaxy()/2;setfillstyle(1,RED); /* Asigna color del cuadro*/setcolor(WHITE); /* Asigna color texto*/bar(f_x3-ANCHO,f_y3-ALTO,f_x3+ANCHO,f_y3+ALTO); /* Dibuja cuadro*/rectangle(f_x3-ANCHO,f_y3-ALTO,f_x3+ANCHO,f_y3+ALTO); /* Dibuja contorno*/rectangle(f_x3-ANCHO+SEP,f_y3-ALTO+SEP,f_x3+ANCHO-SEP,f_y3+ALTO-SEP);

/* Imprime registro de caracteres---------------------------------------*/outtextxy(f_x3-ANCHO+4*SEP,f_y3-SEP/2,mensaje);}

Page 91: Comunicación de dos ordenadores mediante el …deeea.urv.cat/public/PROPOSTES/pub/pdf/517pub.pdf · sistema de comunicaciones es captar señales digitales y modularlas para la emisión

7. ANEXO 1: ALGORITMO Comunicación de dos ordenadores con protocolo x-módem

89

void pinta_circle(int color_A,int color_B){/*************************************************************************************** OBJETIVO: Pintar los circulos informativos de las opciones seleccionadas en el entorno de configuracion. Se basa en el contenido del siguiente registro:

| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | // selection // | | -------> 0 - com_1 // 1 - com_2

|------------> 0 - Auto // 1 – Manual VARIABLES ENTRADA:

-color_A, color_B -> Color del circulo superior e inferior correspondientemente.***************************************************************************************/int c_yA=0, /* Coordenada y del circulo A (Superior)*/

c_xA, /* Coordenada x del circulo A*/c_yB, /* Coordenada y del circulo B (Inferior)*/c_xB; /* Coordenada x del circulo B*/

/* Borra la seleccion actual de los circulos---------------------------------------------------*/setcolor(BLUE);setfillstyle(1,BLUE);while (c_yA!=C_Y1)

{/*Utiliza la variable c_yA como auxiliar para borrar los dos circulos*/ if (c_yA==0)

c_yA=C_Y0; /* Primero borra el circulo superior*/ else

c_yA=C_Y1; /* Posteriormente borra el inferior*/ sector(115,c_yA,0,360,RADIO,RADIO); /* Circulo Izquierdo*/ sector(415,c_yA,0,360,RADIO,RADIO); /* Circulo Derecho*/}

/* Selección de cordenadas de los circulos seleccinados-------------------------------------------------------------------*/switch (selection&0x03)

{case 0:{ c_xA=C_X0; /* Circulo A: Izquierdo – Superior*/

c_yA=C_Y0; c_xB=C_X0; /* Circulo B: Izquierdo – Inferior*/ c_yB=C_Y1; break;}

case 1:{ c_xA=C_X1; /* Circulo A: Derecho – Superior*/ c_yA=C_Y0; c_xB=C_X0; /* Circulo B: Izquierdo – Inferior*/ c_yB=C_Y1; break;}

case 2:{c_xA=C_X0; /* Circulo A: Izquierdo – Superior*/ c_yA=C_Y0; c_xB=C_X1; /* Circulo B: Derecho – Inferior*/ c_yB=C_Y1; break;}

case 3:{c_xA=C_X1; /* Circulo A: Derecho – Superior*/ c_yA=C_Y0; c_xB=C_X1; /* Circulo B: Izquierdo – Inferior*/ c_yB=C_Y1; break;}

}

Page 92: Comunicación de dos ordenadores mediante el …deeea.urv.cat/public/PROPOSTES/pub/pdf/517pub.pdf · sistema de comunicaciones es captar señales digitales y modularlas para la emisión

7. ANEXO 1: ALGORITMO Comunicación de dos ordenadores con protocolo x-módem

90

/* Seleccion de colores---------------------------*/setcolor(color_A); /* Color circulo A*/setfillstyle(1,color_A);sector(c_xA,c_yA,0,360,RADIO,RADIO); /* Pinta el circulo A*/setcolor(color_B); /* Color circulo B*/setfillstyle(1,color_B);sector(c_xB,c_yB,0,360,RADIO,RADIO); /* Pinta circulo B*/}

void escribe_inf_modem(char datos[NCINFM]){/*************************************************************************************** OBJETIVO: Escribir en pantalla la informacion obtenida previamente mediante la funcion

get_data_modem y almacenada en "datos". VARIABLES ENTRADA:

- datos[NCINFM] -> Registro que contiene la informacion obtenida del modem.***************************************************************************************/int aux_write_inf, /* Para recorrer el registro*/

im_x=INI_SCR_SETUP_x, /* Coordenada X*/im_y=INI_SCR_SETUP_y; /* Coordenada Y*/

/* Limpia area destinada a mensajes-------------------------------------------*/setfillstyle(1,BLUE);bar(70+SEP,40+SEP,550-SEP,200-SEP);

/* Imprime informacion-----------------------------*/for(aux_write_inf=0;aux_write_inf<=NCINFM;aux_write_inf++)

{gotoxy(INI_SCR_SETUP_x,im_y); if (datos[aux_write_inf]==CR)

if (datos[aux_write_inf-1]=='0'){/* El codigo OK (0) va siempre precedido del caracter 13*/gotoxy(im_x-1,im_y); /* Borramos el 0 del

screen*/printf(" ");aux_write_inf=NCINFM; /* Para salir*/}

else /* Caso que no siga un 0, imprime en screen*/{im_y++; /* Incrementa linea*/ im_x=INI_SCR_SETUP_x; /* Coordenada X inicial*/ aux_write_inf++;} /* Para siguiente caracter*/

else /* Caso contrario imprime caracter normalmente*/{gotoxy(im_x,im_y); printf("%c",datos[aux_write_inf]); if (datos[aux_write_inf]==10) /* Caso sea caracter LF*/

im_x--; im_x++;}

}}

Page 93: Comunicación de dos ordenadores mediante el …deeea.urv.cat/public/PROPOSTES/pub/pdf/517pub.pdf · sistema de comunicaciones es captar señales digitales y modularlas para la emisión

7. ANEXO 1: ALGORITMO Comunicación de dos ordenadores con protocolo x-módem

91

void get_name_file(char name[38],defmenu menu6[3]){/*************************************************************************************** OBJETIVO: Obtener el nombre del fichero que se desea transmitir. VARIABLES ENTRADA:

- menu6[3] -> Registro de carga del contenido de los enunciados de todo el entorno. VARIABLES SALIDA:

- name[38] -> Registro de carga del nombre del fichero.***************************************************************************************/int aux_name; /* Variable auxiliar ayuda a cargar nombre*/

/* Inicializa variables-------------------------*/aux_name=0;strcpy(name," "); /* Limpia registro del nombre fichero*/bar(menu6[1].menu[0].pos_x+ANCHO/2,menu6[1].menu[0].pos_y,menu6[1].menu[0].pos_x+2*ANCHO,

menu6[1].menu[0].pos_y+textheight(""));

/* Obtiene string de caracteres------------------------------------*/name[aux_name]=getch(); /* Obtenemos primer caracter*/if (name[aux_name]>=33) /* Entra si es Alfanumerico*/

outtextxy(menu6[1].menu[0].pos_x+110,menu6[1].menu[0].pos_y,name);else /* Caso si no es caracter alfanumerico*/ {name[aux_name]=' '; /* Limpia caracter*/

aux_name--;}

while ((aux_name<35)&&(name[aux_name]!=CR)){/* Sale si introduce mas 35 car alfanum o press ENTER*/aux_name++; /* Incrementa num caracteres*/name[aux_name]=getch(); /* Obtiene caracter*/if (name[aux_name]>=33) /* Caso caracter alfanumerico*/

outtextxy(menu6[1].menu[0].pos_x+110,menu6[1].menu[0].pos_y,name);else /* Caso car no alfanum borra car anterior*/

if ((name[aux_name]!=CR)&&(aux_name>=0)){ /* Caso no ENTER (cod ASCII:13)*/ name[aux_name]=' '; /* Limpia ultimo caracter no alfanumerico*/ if (aux_name>=1)

{/* Borra anterior valido*/ name[aux_name-1]=' '; aux_name-=2;}

else /* Caso aux_name==0*/aux_name--;

bar(menu6[1].menu[0].pos_x+ANCHO/2,menu6[1].menu[0].pos_y, menu6[1].menu[0].pos_x+2*ANCHO,menu6[1].menu[0].pos_y+textheight(""));outtextxy(menu6[1].menu[0].pos_x+110,menu6[1].menu[0].pos_y,name);}

}

/* Borra caracter ENTER------------------------------*/if (name[aux_name]==CR)

name[aux_name]=' ';}

Page 94: Comunicación de dos ordenadores mediante el …deeea.urv.cat/public/PROPOSTES/pub/pdf/517pub.pdf · sistema de comunicaciones es captar señales digitales y modularlas para la emisión

7. ANEXO 1: ALGORITMO Comunicación de dos ordenadores con protocolo x-módem

92

/***************** FUNCIONES RELACIONADAS CON TRANSMISION DATOS ***************/int send_file(FILE *f,int ntblck){/*************************************************************************************** OBJETIVO: Enviar un fichero mediante protocolo X-MODEM. VARIABLES ENTRADA:

- *f -> Direccion de fichero a transmitir- ntblck -> Numero Total de Bloques

VARIABLES SALIDA:- Retorna los siguientes valores:

0 -- Transmision correcta -1 -- CAN recibido. Finaliza transmision. -2 -- Numero Iteraciones erroneas superado. -3 -- EOT no transmitido. -4 -- No reconoce EOT por parte del receptor

***************************************************************************************/unsigned char answer=' ', /* Byte almacen respuesta de receptor*/

string[132]; /* Vector almacen bloques X-MODEM*/int ssy,

index, /* Servira para enviar char por char*/nbck=1, /* Constata el bloque a enviar*/end=0, /* Flag indicador de final transmision*/nie=0; /* Numero Iteraciones Erroneas*/

long int aux_block=0;

/* Transmision del numero total de bloques----------------------------------------------------*/setfillstyle(1,BLUE);bar(205+SEP,100+SEP,580-SEP,400-SEP);convert_num_car(string,ntblck); /* Conversion a caracteres para su transmision

con formato XMODEM*/while (answer!=ACK)

answer=manda_block(string); /* Transmision hasta recepcion correcta*/

/* Transmision de fichero------------------------------*/make_block(string,nbck,f); /* Fabrica el bloque num 1*/ssy=INI_SCR_SR_y; /* Posicion inicial coordenada Y*/while ((end!=2)&&(nie<10)&&(modem_conect))

{/* Entra si existe conexion y menos de 10 errores en transmision*/ answer=manda_block(string); /* Envia bloque*/ switch(answer)

{case ACK:{ /* Caso bloque enviado correctamente*/ nie=0; /* Reset contador errors*/ escribe_mensaje(INI_SCR_SR_x,&ssy,INI_SCR_SR_y,FIN_LINE_SR,

"Bloque enviado numero: "); gotoxy(INI_SCR_SR_x+23,ssy); printf("%d",string[1]); aux_block=aux_block+1; /* Incrementa contador global*/ nbck=nbck+1; /* Incrementa contador XMODEM*/ if (nbck==256)

nbck=0; bar(B_PRSx,B_PRSy,B_PRSx+W_PRS,

(B_PRSy+(H_PRS*aux_block/ntblck))); if (end)

end=2; /* Sale si no hay datos a enviar*/ else

end=make_block(string,nbck,f); /* Crea nuevo bloque*/ break;}

Page 95: Comunicación de dos ordenadores mediante el …deeea.urv.cat/public/PROPOSTES/pub/pdf/517pub.pdf · sistema de comunicaciones es captar señales digitales y modularlas para la emisión

7. ANEXO 1: ALGORITMO Comunicación de dos ordenadores con protocolo x-módem

93

case NAK:{escribe_mensaje(INI_SCR_SR_x,&ssy,INI_SCR_SR_y,FIN_LINE_SR,"Dato mal enviado... ");

nie++; /* Incrementa contador iteraciones errorneas*/ break;}

case CAN:{escribe_mensaje(INI_SCR_SR_x,&ssy,INI_SCR_SR_y,FIN_LINE_SR,"Señal CAN recibido. ");

escribe_mensaje(INI_SCR_SR_x,&ssy,INI_SCR_SR_y,FIN_LINE_SR,"Cancelando transmision... ");

return(-1); /* Indica error*/ }

} /* fin switch*/} /* fin while*/

if (nie>9)return(-2);

/* Finalizacion de transmision------------------------------------*/if (modem_conect)

{/* Entra si conexion OK*/end=0;answer=' '; /* Para esperar recepcion ACK*/if (manda_dato(EOT)==-1)

{escribe_mensaje(INI_SCR_SR_x,&ssy,INI_SCR_SR_y,FIN_LINE_SR,"Error de transmision del EOT. ");

return(-3);}

elsewhile ((answer!=ACK)&&(end==0))

end=recibe_dato(&answer); /* Espera recibir ACK*/if (end==1)

{escribe_mensaje(INI_SCR_SR_x,&ssy,INI_SCR_SR_y,FIN_LINE_SR,"Error de transmision del EOT.");

escribe_mensaje(INI_SCR_SR_x,&ssy,INI_SCR_SR_y,FIN_LINE_SR,"Activacion de TimeOut. ");

escribe_mensaje(INI_SCR_SR_x,&ssy,INI_SCR_SR_y,FIN_LINE_SR,"Caracter ACK no recibido. ");

return(-4);}

}pausa_seg(1); /* Pausa para pemitir al usuario leer mensajes*/setfillstyle(1,BLUE); /* Limpia screen para mensajes posteriores*/bar(205+SEP,100+SEP,580-SEP,400-SEP);return(0);}

Page 96: Comunicación de dos ordenadores mediante el …deeea.urv.cat/public/PROPOSTES/pub/pdf/517pub.pdf · sistema de comunicaciones es captar señales digitales y modularlas para la emisión

7. ANEXO 1: ALGORITMO Comunicación de dos ordenadores con protocolo x-módem

94

char manda_block(unsigned char block[132]){/*************************************************************************************** OBJETIVO: Enviar todo un bloque de caracteres segun el protocolo X-Modem. VARIABLES ENTRADA:

- block[132] -> Registro cargado con el bloque a enviar. VARIABLES SALIDA:

- Retorna ACK, NACK y CAN mandado por el receptor.***************************************************************************************/int ind, /* Indice para enviar caracteres del bloque/

end_sb; /* Flag que indica error si no manda dato*/char respuesta; /* Caracter que indica situacion del envio*/

/* Transmision del bloque-------------------------------*/data_trans=1; /* Para enviar primer byte*/for (ind=0;ind<=131;ind++)

{end_sb=manda_dato(block[ind]); /* Envia bloque*/ if (end_sb==-1)

return(CAN); /* CANcel en caso error*/}

/* Recepcion de respuesta-------------------------------*/data_recep=0; /* Indica RBR vacio*/end_sb=recibe_dato(&respuesta); /* Obtiene dato de receptor*/if (end_sb==-1)

return(CAN); /* CANcel en caso de error*/else

return(respuesta); /* respuesta es ACK,NAK o CAN*/}

int manda_dato(unsigned char DATO){/*************************************************************************************** OBJETIVO: Mandar un byte mediante control de flujo de datos entre UART y MODEM por hardware

(CTS/RTS). VARIABLES ENTRADA:

- DATO -> Caracter a enviar VARIABLES SALIDA:

- Devuelve el siguiente codigo:-1 : Error en la transmision

0 : Transmision realizada correctamente***************************************************************************************/unsigned char control;

control=inportb(B_UART+6); /* Lectura MSR (Modem Status Register)*/reset_timer(); /* Reset contador timer*/if ((control&0x10)==0) /* Si no detecta CTS (Clear To Send)*/

outportb(B_UART+4,inportb(B_UART+4)|0x02); /* Aserta RTS*/while ((control&0x10==0)&&(timeout==0)) /* Espera hasta este listo o TimeOut activo*/

control=inportb(B_UART+6);while ((data_trans!=1)&&(timeout==0)); /* Espera a que THR vacio o TimeOutactivo*/if (timeout==1)

return(-1); /* Salida con error*/else

outportb(B_UART,DATO); /* Manda dato a THR (Transmitter Holding Register)*/data_trans=0; /* Indica Registro cargado*/return(0); /* Salida sin error*/

Page 97: Comunicación de dos ordenadores mediante el …deeea.urv.cat/public/PROPOSTES/pub/pdf/517pub.pdf · sistema de comunicaciones es captar señales digitales y modularlas para la emisión

7. ANEXO 1: ALGORITMO Comunicación de dos ordenadores con protocolo x-módem

95

}int recep_file(char name_file[38]){/***************************************************************************************

OBJETIVO: Recibir un fichero mediante protocolo X-MODEM.VARIABLES ENTRADA:

- name_file[38] -> Nombre del fichero para almacenar los datos de entrada.***************************************************************************************/long int nbck_r,aux_block_r;int nie_r=1, /* Contador de errores*/

fin_r=NAK, /* Booleano indica fin de transmision*/ntbr=0,index_r; /* Para navegar por el string*/

FILE *f_r; /* Puntero a direccion de fichero*/unsigned char result, /* Informa estado de la transmision*/

registro[132]; /* Bloque recibido*/int sr_y=INI_SCR_SR_y; /* Cord Y escribir mensajes screen*/

/* Inicializaciones---------------------*/f_r=fopen(name_file,"w"); /* Abre fichero para escritura*/nbck_r=1; /* Bloque numero 1*/data_trans=1; /* Para enviar el primer byte*/while ((fin_r!=0)&&(nie_r<=10)&&(modem_conect))

{reset_timer(); escribe_mensaje(INI_SCR_SR_x,&sr_y,INI_SCR_SR_y,FIN_LINE_SR,

"Informa receptor preparado... "); escribe_mensaje(INI_SCR_SR_x,&sr_y,INI_SCR_SR_y,FIN_LINE_SR,

"Numero de intentos: "); gotoxy(INI_SCR_SR_x+22,sr_y); printf("%d",nie_r); escribe_mensaje(INI_SCR_SR_x,&sr_y,INI_SCR_SR_y,FIN_LINE_SR,"NAK enviado...");

/* Consulta sistema preparado------------------------------------*/ fin_r=manda_dato(NAK); /* NAK indica Receptor preparado

La funcion retorna 0 o -1 (si TimeOut=1)*/ if (fin_r==0) /* Si no se prolonga la espera (TimeOut)*/

{result=recep_block(registro,nbck_r); /*Recepcion numero total bloques recibir*/ if (result==ACK)

{escribe_mensaje(INI_SCR_SR_x,&sr_y,INI_SCR_SR_y,FIN_LINE_SR,"Emisor Preparado...");

nie_r=1; manda_dato(ACK);}

else{fin_r=-1; nie_r++; escribe_mensaje(INI_SCR_SR_x,&sr_y,INI_SCR_SR_y,FIN_LINE_SR,

"Emisor no preparado."); }

} else

{nie_r++; escribe_mensaje(INI_SCR_SR_x,&sr_y,INI_SCR_SR_y,FIN_LINE_SR,

"Emisor no preparado.");}

}

Page 98: Comunicación de dos ordenadores mediante el …deeea.urv.cat/public/PROPOSTES/pub/pdf/517pub.pdf · sistema de comunicaciones es captar señales digitales y modularlas para la emisión

7. ANEXO 1: ALGORITMO Comunicación de dos ordenadores con protocolo x-módem

96

if ((nie_r<=10)&&(modem_conect)){ntbr=convert_car_num(registro); /* Conversion de caracteres a valor entero*/escribe_mensaje(INI_SCR_SR_x,&sr_y,INI_SCR_SR_y,FIN_LINE_SR,

"NUMERO TOTAL DE BLOQUES A RECIBIR:");gotoxy(INI_SCR_SR_x+36,sr_y);printf("%d",ntbr);nbck_r=1;aux_block_r=1;while ((nie_r<=10)&&(result!=EOT)&&(result!=CAN)&&(modem_conect))

{result=recep_block(registro,nbck_r); /* Recibe Bloque*/ switch(result)

{case ACK:{nie_r=0; /* Reset contador de errores*/ escribe_mensaje(INI_SCR_SR_x,&sr_y,INI_SCR_SR_y,

FIN_LINE_SR,"Bloque recibido numero:"); gotoxy(INI_SCR_SR_x+24,sr_y); printf("%d",registro[1]); data_trans=1; manda_dato(ACK); /* Indica trans OK*/ setfillstyle(1,GREEN); /* Color barra proceso*/ /* Pinta barra proceso según estado actual*/ bar(B_PRSx,B_PRSy+H_PRS,B_PRSx+W_PRS,

B_PRSy+H_PRS-(H_PRS*aux_block_r)/ntbr); nbck_r++; if (nbck_r==256)

nbck_r=0; aux_block_r++; /*Almacena bloque fichero*/ for(index_r=3;index_r<=130;index_r++)

fprintf(f_r,"%c",registro[index_r]); break;}

case NAK:{nie_r++; /* Incrementa contado de error*/ escribe_mensaje(INI_SCR_SR_x,&sr_y,INI_SCR_SR_y,

FIN_LINE_SR,"Error en los datos recibidos. "); escribe_mensaje(INI_SCR_SR_x,&sr_y,INI_SCR_SR_y,

FIN_LINE_SR,"Reintento numero: "); gotoxy(INI_SCR_SR_x+19,sr_y); printf("%d",nie_r); data_trans=1; manda_dato(NAK); /* Informa al emisor error de transmision*/ break;}

case EOT:{escribe_mensaje(INI_SCR_SR_x,&sr_y,INI_SCR_SR_y,FIN_LINE_SR,"Fichero recibido. ");

data_trans=1; manda_dato(ACK); /* Indica EOT bien recibido*/ break;}

case CAN:{escribe_mensaje(INI_SCR_SR_x,&sr_y,INI_SCR_SR_y,FIN_LINE_SR,"Activacion de TimeOut... ");

data_trans=1; manda_dato(CAN); /* Desea CANcelar transmision*/ break;}

}}

close(f_r);escribe_mensaje(INI_SCR_SR_x,&sr_y,INI_SCR_SR_y,FIN_LINE_SR,"Recepcion finalizada.. ");return(0);

}else

return(-1);

Page 99: Comunicación de dos ordenadores mediante el …deeea.urv.cat/public/PROPOSTES/pub/pdf/517pub.pdf · sistema de comunicaciones es captar señales digitales y modularlas para la emisión

7. ANEXO 1: ALGORITMO Comunicación de dos ordenadores con protocolo x-módem

97

}char recep_block(unsigned char block_r[132],int numb){/*************************************************************************************** OBJETIVO: Recibir todo un bloque de caracteres ordenados segun el protocolo X-modem. VARIABLES ENTRADA:

- block_r[132] -> Registro cargadi con el bloque a enviar.- numb -> Numero de bloque a recibir.

VARIABLES SALIDA:- Retorna ACK, NAK, EOT y CAN segun el estado de la transmision.

***************************************************************************************/int endr=0, /* Indica salida por error*/

ind_regr;

data_recep=0; /* Indica RBR vacio*/block_r[0]=' ';while ((block_r[0]!=SOH)&&(block_r[0]!=EOT)&&(endr==0)) /* Espera ACK o EOT*/

endr=recibe_dato(&block_r[0]);if (endr==-1) /* Caso espera demasiado larga (TimeOut)*/

return(CAN);if (block_r[0]==EOT) /* Caso finalizar transmision por fichero enviado*/

return(EOT);/* Si llega aqui, ha recibido SOH*/

if (recibe_dato(&block_r[1])==-1) /* Espera recepecion de numero bloque*/return(CAN); /* Caso no recibir nada,cancela transmision*/

if (block_r[1]!=numb) /* Confirma numero bloque correcto*/return(NAK); /* Si no lo es, informa deseo reenvio*/

if (recibe_dato(&block_r[2])==-1) /* Espera receptor de numero de bloque en Ca1*/return(CAN); /* Caso no recibir nada cancela transmision*/

if (block_r[2]!=(0xFF-numb)) /* Confirma numero bloque en Ca1 OK*/ return(NAK); /* Si no lo es, informa deseo reenvio*/

for (ind_regr=3;ind_regr<132;ind_regr++) /* Recibe 128 Octetos de datos*/if (recibe_dato(&block_r[ind_regr])==-1)

return(CAN); /* Si no recibe dato en 15 s, cancela transmision*/if (chk_sum(block_r)!=block_r[131]) /* Observa datos recibidos correctos segunCheckSum*/

return(NAK);return(ACK); /* Informa bloque recibido correcto*/}

int recibe_dato(unsigned char *r_data){/*************************************************************************************** OBJETIVO: Recibir un byte. VARIABLES SALIDA:

- *r_data -> Byte recibido.- La fucion retorna el siguiente codigo:

-1 : Error en la recepcion 0 : Dato recibido correctamente

***************************************************************************************/reset_timer(); /* Reset contador timer*/while ((data_recep!=1)&&(timeout==0)); /* Espera RBR vacio (Receiver Buffer Register)*/if (timeout==1)

return(-1);*r_data=inportb(B_UART); /* Capta Byte del registro RBR*/data_recep=0; /* Indica RBR esta cargado*/return(0);}

Page 100: Comunicación de dos ordenadores mediante el …deeea.urv.cat/public/PROPOSTES/pub/pdf/517pub.pdf · sistema de comunicaciones es captar señales digitales y modularlas para la emisión

7. ANEXO 1: ALGORITMO Comunicación de dos ordenadores con protocolo x-módem

98

int cuenta_bloques(char n_fichero[38]){/*************************************************************************************** OBJETIVO: Realizar la cuenta de numero del bloques existente en un determinado fichero. Utiliza la

funcion “make_block”. VARIABLES ENTRADA:

- n_fichero[38] -> Registro que contien el nombre del fichero en cuestion. VARIABLES SALIDA:

- La funcion retorna el numero de bloques que contiene el fichero.***************************************************************************************/int total_blk, /* Numero de bloques que contiene el fichero*/

fdf, /* Final De Fichero*/FILE *fichero;char registro[132]; /* Registro de almacen del bloque creado*/

/* Controla la existencia del fichero-------------------------------------------*/fichero=fopen(n_fichero,"r");if (fichero==NULL)

return(NULL); /* Si no existe sale*/fdf=0;total_blk=0;

/* Cuenta mientras no sea final de fichero--------------------------------------------------*/while (fdf==0)

{fdf=make_block(registro,total_blk,fichero); total_blk++; }

close(fichero);return(total_blk);}

Page 101: Comunicación de dos ordenadores mediante el …deeea.urv.cat/public/PROPOSTES/pub/pdf/517pub.pdf · sistema de comunicaciones es captar señales digitales y modularlas para la emisión

7. ANEXO 1: ALGORITMO Comunicación de dos ordenadores con protocolo x-módem

99

int make_block(unsigned char *bl,char blk,FILE *ff){/*************************************************************************************** OBJETIVO: Fabricar un bolque de datos de un fichero segun sugiere el protocolo X-MODEM: ____________________________

|____________________________|--> Bloque de 132 Bytes | | | |_____________________| |---> CheckSum

| | | |-----------------------> 128 bytes de datos | | |----------------------------------------> Numero bloque complemento a 1 | |------------------------------------------> Numero bloque |--------------------------------------------> SOH (Start Of Header)

En caso de no haber suficientes caracteres para cargar el bloque, se debe rellenar con ceros. VARIABLES ENTRADA:

- blk -> Numero de bloque- *ff -> Direccon del Fichero

VARIABLES SALIDA:- bl[132] -> Bloque en forma XMODEM- Funcion informa si existe trata el ultimo bloque (1) o no (0).

***************************************************************************************/char c; /* Para leer caracter*/char blc=0xFF-blk; /* complemento a 1*/int ind_reg=3, /* Indice Bloque*/

eof; /* End Of File*/unsigned char chk; /* CheckSum/

/* Creacion de un bloque------------------------------*/

/* Creamos bloque si hay como minimo un caracter en el fichero*/eof=fscanf(ff,"%c",&c); /* Lectura caracter de fichero*/if (eof!=EOF)

{bl[0]=SOH; /* Start Of Header (bit de cabecera)*/ bl[1]=blk; /* Numero de bloque*/ bl[2]=blc; /* Numero de bloque en Ca1*/ bl[3]=c; /* Primer carácter*/ ind_reg=4;}

else /* Caso en que no exista ningun caracter a transmitir*/{close(ff); return(1); /* Asi evita entrar*/}

while (ind_reg<=130){eof=fscanf(ff,"%c",&c); /* Lectura controlando final de fichero*/ bl[ind_reg]=c;

if (eof==EOF){ for (ind_reg=ind_reg;ind_reg<=130;ind_reg++) /* Rellenamos con 0's lo que falte*/

bl[ind_reg]=0x00; close(ff);}

ind_reg++;}

chk=chk_sum(bl); /* Calcula CheckSum*/bl[131]=chk; /* Lo inserta en ultimo byte del bloque*/if (eof==EOF) return(1);else return(0);}

Page 102: Comunicación de dos ordenadores mediante el …deeea.urv.cat/public/PROPOSTES/pub/pdf/517pub.pdf · sistema de comunicaciones es captar señales digitales y modularlas para la emisión

7. ANEXO 1: ALGORITMO Comunicación de dos ordenadores con protocolo x-módem

100

unsigned char chk_sum(unsigned char vector[132]){/*************************************************************************************** OBJETIVOS: Realiza el calculo del CheckSum de los bytes de datos. El calculo se realiza mediante la suma de los 128 octetos modulo 256. VARIABLES ENTRADA:

- vector[132] -> Registro que contiene el bloque XMODEM. VARIABLES SALIDA:

- La funcion devuelve el valor del CheckSum.***************************************************************************************/int aux_chk, /* Para desplazarse dentro del string*/

sumat=0; /* Acumulador de la suma de los bytes*/

/* Calculo del Checksum------------------------------*/for (aux_chk=3;aux_chk<=130;aux_chk++)

sumat=sumat+vector[aux_chk];

return(sumat%256);}

Page 103: Comunicación de dos ordenadores mediante el …deeea.urv.cat/public/PROPOSTES/pub/pdf/517pub.pdf · sistema de comunicaciones es captar señales digitales y modularlas para la emisión

7. ANEXO 1: ALGORITMO Comunicación de dos ordenadores con protocolo x-módem

101

/********************* FUNCIONES RELACIONADAS CON MODEM ************************/int conf_mod_auto_r(void){/*************************************************************************************** OBJETIVO: Situar el modem en estado de respuesta automatica. VARIABLES SALIDA:

- La funcion retorna –1, exite algun error; o 0, si todo es correcto.***************************************************************************************/data_trans=1; /* Para enviar el primer dato*/

/* Emision de ATS0=1---------------------------*/if (manda_dato('A')==-1)

return(-1);if (manda_dato('T')==-1)

return(-1);

/* S0=1 -> Responde automaticamente despues 1 tono llamada---------------------------------------------------------------------------*/if (manda_dato('S')==-1)

return(-1);if (manda_dato('0')==-1)

return(-1);if (manda_dato('=')==-1)

return(-1);if (manda_dato('1')==-1)

return(-1);

/* Emision de ENTER--------------------------*/if (manda_dato(CR)==-1)

return(-1);

return(0);}

Page 104: Comunicación de dos ordenadores mediante el …deeea.urv.cat/public/PROPOSTES/pub/pdf/517pub.pdf · sistema de comunicaciones es captar señales digitales y modularlas para la emisión

7. ANEXO 1: ALGORITMO Comunicación de dos ordenadores con protocolo x-módem

102

void get_tel_number(char tel_number[15]){/*************************************************************************************** OBJETIVO: Obtener el numero de telefono del abonado con el que se quiere comunicar mediante el

teclado. VARIABLES SALIDA:

- tel_number[15] -> Registro que contiene el string de caracteres que definen eltelefono del sistema remoto.

***************************************************************************************/int index_tel; /* Variable util para navegar por tel_numer[15]*/char opt_num;

fin_kb(); /* Asignamos antigua subrutina atencion int teclado*/

/* Obtencion de numero telefonico------------------------------------------*/do {paint_message("Introduzca el numero a marcar:");

strcpy(tel_number," "); /* Limpia string*/ index_tel=0; while ((index_tel<15)&&(tel_number[index_tel]!=CR))

{tel_number[index_tel]=getch(); /* Obtiene caracter*/

/* Asegura que caracter es numerico*/if ((tel_number[index_tel]>=48)&&(tel_number[index_tel]<=57)&&

(tel_number[index_tel]!=CR)){outtextxy(getmaxx()/2+ANCHO/3,getmaxy()/2+ALTO/2,tel_number); index_tel++;}

}if (tel_number[index_tel]==CR)

tel_number[index_tel]=' '; /* Borra caracter CR*/bar(getmaxx()/2-ANCHO+2*SEP,getmaxy()/2-SEP,

getmaxx()/2+ANCHO-2*SEP,getmaxy()/2+ALTO/3);outtextxy(getmaxx()/2-ANCHO+4*SEP,getmaxy()/2-SEP,"¨Es correcto el telefono siguiente?:");opt_num=' ';while ((opt_num!='s')&&(opt_num!='S')&&(opt_num!='n')&&(opt_num!='N')) opt_num=getch();} while ((opt_num=='n')||(opt_num=='N')); /* Hasta tener tel deseado*/

ini_kb(); /* Asignamos nueva subrutina atencion int teclado*/}

int marca_tel(char nt[15]){/************************************************************************************** OBJETIVO: Marcar el numero de telefono existente en el registro "nt". VARIABLES ENTRADA:

- nt[15] -> Registro que contiene el string de caracteres que definen el telefono del sistema remoto. VARIABLES SALIDA:

- La funcion retorna –1 en caso de error.-***************************************************************************************/int i=0; /* Permitira recorrer el registro "nt"*/

reset_timer(); /* Reset contador timer*/data_trans=1; /* Para enviar el primer dato*/if (manda_dato('A')==-1) /* Emision de ATZ0X4*/

return(-1);if (manda_dato('T')==-1)

return(-1);

Page 105: Comunicación de dos ordenadores mediante el …deeea.urv.cat/public/PROPOSTES/pub/pdf/517pub.pdf · sistema de comunicaciones es captar señales digitales y modularlas para la emisión

7. ANEXO 1: ALGORITMO Comunicación de dos ordenadores con protocolo x-módem

103

/* Z0 -> Reinicializa MODEM y carga configuracion almacenada en memoria como Perfil 0 (Conf. fabrica)---------------------------------------------------------------------------------------------------------------------------------*/if (manda_dato('Z')==-1)

return(-1);if (manda_dato('0')==-1)

return(-1);

/* X4 -> Dar codigo de resulados, tono de invitacion a marcar y deteccion linea ocupada----------------------------------------------------------------------------------------------------------*/if (manda_dato('X')==-1)

return(-1);if (manda_dato('4')==-1)

return(-1);

/* Emision de ENTER--------------------------*/if (manda_dato(CR)==-1)

return(-1);paint_message("Preparando para marcar...");pausa_seg(2); /* Pausa 2 seg para dar tiempo MODEM*/

/* Emision de ATDT[num]--------------------------------*/if (manda_dato('A')==-1)

return(-1);if (manda_dato('T')==-1)

return(-1);if (manda_dato('D')==-1) /* DT -> Marcacion por tonos*/

return(-1);if (manda_dato('T')==-1)

return(-1);while ((nt[i]!=' ')&&(i<15))

{if (manda_dato(nt[i])==-1)return(-1);

i++;}

/* Emision de ENTER---------------------------*/if (manda_dato(CR)==-1)

return(-1);modem_conect=0; /* Todavia no hay conexión*/paint_message("Estableciendo conexion...");reset_timer(); /* Reset contador timer*/seg=-20; /* Para aumentar TimeOut a 30 seg*/while ((!modem_conect)&&(!timeout)); /* Espera hasta conectar*/if (timeout==1) /* Si pasa 30 seg sin conectar*/

{paint_message("Error de conexion..."); colgar_modem(); pausa_seg(2); /* Da tiempo observar mensaje screen*/ return(-1);}

paint_message("CONEXION ESTABLECIDA...");pausa_seg(2); /* Tiempo que permite a modems establecerconexion*/return(0);}

Page 106: Comunicación de dos ordenadores mediante el …deeea.urv.cat/public/PROPOSTES/pub/pdf/517pub.pdf · sistema de comunicaciones es captar señales digitales y modularlas para la emisión

7. ANEXO 1: ALGORITMO Comunicación de dos ordenadores con protocolo x-módem

104

int resp_llam(void){/*************************************************************************************** OBJETIVO: Responder manualmente a una llamada. VARIABLES SALIDA:

- La funcion extrae –1 en caso de error o 0 si la funcion se ha ejecutado sin problemas.***************************************************************************************/data_trans=1; /* Para enviar primer dato*/reset_timer(); /* Reset contador timer*/seg=-10; /* Para aumentar TimeOut hasta 25 seg*/

/* Emision de ATZ0 -> Reinicializa el Modem y carga configuracion almacenada en Perfil 0---------------------------------------------------------------------------------------------------------------*/if (manda_dato('A')==-1)

return(-1);if (manda_dato('T')==-1)

return(-1);if (manda_dato('Z')==-1)

return(-1);if (manda_dato('0')==-1)

return(-1);if (manda_dato(CR)==-1) /* Emision de ENTER*/

return(-1);paint_message("Inicializando...");pausa_seg(2); /* Pausa 2 seg para dar tiempo MODEM*/paint_message("ATENDIENDO LA LLAMADA...");

/* Emision de ATA -> Contestación manual-----------------------------------------------------*/if (manda_dato('A')==-1)

return(-1);if (manda_dato('T')==-1)

return(-1);if (manda_dato('A')==-1)

return(-1);if (manda_dato(CR)==-1) /* Emision de ENTER*/

return(-1);

/* Establecimiento de conexion--------------------------------------*/modem_conect=0; /* Todavia no hay conexion*/reset_timer(); /* Reset contador timer*/while ((!modem_conect)&&(!timeout)); /* Espera hasta conectar o activar deTimeout*/if (timeout==1)

{paint_message("Error de conexion..."); colgar_modem(); pausa_seg(2); /* Tiempo para observar mensaje en screen*/ return(-1); }

paint_message("CONEXION ESTABLECIDA...");pausa_seg(2); /* Tiempo que permite comunicar losmodem*/return(0);}

Page 107: Comunicación de dos ordenadores mediante el …deeea.urv.cat/public/PROPOSTES/pub/pdf/517pub.pdf · sistema de comunicaciones es captar señales digitales y modularlas para la emisión

7. ANEXO 1: ALGORITMO Comunicación de dos ordenadores con protocolo x-módem

105

int get_data_modem(char modem_data[100]){/*************************************************************************************** OBJETIVO: Suministrar informacion del modelo y fabricante del MODEM. VARIABLES SALIDA:

- modem_data[100] -> Registro de informacion del modem- Funcion retorna el siguiente codigo:

-1: Datos no recibidos0: Datos recibido correctamente

***************************************************************************************/int index_gd=0; /* Variable auxiliar para cargar modem_datos*/

/* Emision de ATI6 -> Suministrar informacion del modem------------------------------------------------------------------------*/data_trans=1; /* Para transmitir el primer Byte*/if (manda_dato('A')==-1)

return(-1);if (manda_dato('T')==-1)

return(-1);if (manda_dato('I')==-1)

return(-1);if (manda_dato('6')==-1)

return(-1);if (manda_dato(CR)==-1) /* Emision de ENTER*/

return(-1);

/* Recepcion de datos--------------------------*/data_recep=0; /* Indica registro lleno*/recibe_dato(&modem_data[index_gd]); /* Capta Byte de RBR*/while (modem_data[index_gd]!=CR) /* Capta Byte hasta obtener CR (ENTER)*/

if (recibe_dato(&modem_data[index_gd])==-1)return(-1); /* Sale en caso de error recepcion (TimeOut)*/

/* Adquisicion de datos del modem------------------------------------------*/while (index_gd<100)

{if (recibe_dato(&modem_data[index_gd])==-1)return(-1);

if (modem_data[index_gd]==CR) /* ENTER precede al cod 0x00*/if (modem_data[index_gd-1]=='0') /* Indica OK*/

index_gd=99; /* Con proposito de salida*/index_gd++;}

return(0);}

Page 108: Comunicación de dos ordenadores mediante el …deeea.urv.cat/public/PROPOSTES/pub/pdf/517pub.pdf · sistema de comunicaciones es captar señales digitales y modularlas para la emisión

7. ANEXO 1: ALGORITMO Comunicación de dos ordenadores con protocolo x-módem

106

int get_speed_manual(void){/*************************************************************************************** OBJETIVO: Establecer la velocidad del modem de forma manual. VARIABLES SALIDA:

- Funcion retorna el siguiente codigo:0: Ejecucion correcta de la funcion1: Ejecucion erronea

***************************************************************************************/float conta_x=0;float vel_m=-1; // Velocidad del modemstatic char reg_speed[6]; // Registro de velocidad

/* Obtencion de velocidad--------------------------------*/strcpy(reg_speed," "); /* Limpia registro*/fin_kb(); /* Establece subrutina atencion int teclado antigua*/setcolor(BLUE);setfillstyle(1,RED);bar(C_X1+95+SEP,C_Y1-textheight("")+SEP,C_X1+155-SEP,C_Y1+textheight("")-SEP);while (vel_m==-1) /* Mientras no se seleccione velocidad*/

{reg_speed[conta_x]=getch(); /* Obtiene caracter*/ if ((reg_speed[0]>=48)&&(reg_speed[0]<=57)&&reg_speed[0]!=CR)outtextxy(520,418,reg_speed); /* Car comprendido entre 48 y 57 (ASCII)*/ else

conta_x--; while ((conta_x<=4)&&(reg_speed[conta_x]!=CR))

{/* Contempla 5 digitos (suponiendo max. vel. 19200 baudios)*/ conta_x++; /* Incrementa coordenada X*/ reg_speed[conta_x]=getch(); /* Obtiene caracter*/ if ((reg_speed[conta_x]>=48)&&(reg_speed[conta_x]<=57)&&reg_speed[conta_x]!=CR)

outtextxy(520,418,reg_speed); /* Car comprendido entre 48 y 57 (ASCII)*/ else

if (reg_speed[conta_x]!=CR)conta_x--; /* Decrementa por no contener car num*/

} conta_x--; /* No consideramos CR (ENTER)*/ if (conta_x==3)

{/* Si tenemos 4 digitos desplazamos el registro a la derecha*/for(conta_x=3;conta_x>=0;conta_x--)

reg_speed[conta_x+1]=reg_speed[conta_x];reg_speed[0]='0';conta_x=3; /* Recupera el valor anterior*/}

if (conta_x<3){/* Borra para reinsertar valor (min. 4 dig. /- 1200 bps -/)*/bar(C_X1+95+SEP,C_Y1-textheight("")+SEP,C_X1+155-SEP,C_Y1+textheight("")-SEP);strcpy(reg_speed," "); /* Limpia registro*/vel_m=-1; /* Indica velocidad no establecida*/conta_x=0; /* Reset contador*/}

else{/* Caso conta>=3. Convierte string caracteres a numero*/vel_m=0;for (conta_x=0;conta_x<=4;conta_x++)

vel_m=vel_m+(pow10(4-conta_x))*(reg_speed[conta_x]-48);

Page 109: Comunicación de dos ordenadores mediante el …deeea.urv.cat/public/PROPOSTES/pub/pdf/517pub.pdf · sistema de comunicaciones es captar señales digitales y modularlas para la emisión

7. ANEXO 1: ALGORITMO Comunicación de dos ordenadores con protocolo x-módem

107

/*Observamos si tiene un valor dentro de lo disponible (1200, 2400, 9600, 19200)--------------------------------------------------------------------------------------------------*/if (vel_m==1200)

{/* Minima velocidad posible*/ ini_kb(); /* Rutina atencion int teclado nueva*/ return(96);}

conta_x=vel_m/2;while (conta_x>1200) /* Divide hasta obtener conta <=1200*/

conta_x=conta_x/2;

if ((conta_x==1200)&&(vel_m<=19200)){ini_kb(); /* Rutina atencion int teclado

nueva*/ return(115200/vel_m); /* Retorna divisor segun velocidad*/}

else{vel_m=-1; /* Indica velocidad no establecida*/ conta_x=0; /* Reset contador*/ bar(C_X1+95+SEP,C_Y1-textheight("")+SEP,

C_X1+155-SEP,C_Y1+textheight("")-SEP); strcpy(reg_speed," "); /* Limpia registro*/}

} }

return(0);}

int get_speed_auto(void){/************************************************************************************** OBJETIVO: Obtener la velocidad del modem mediante los comandos ATBi. VARIABLES SALIDA: En caso de error devuelve -1.***************************************************************************************/char result_s='0',

data_D=' ', /* Caracter decenas*/data_U='4'; /* Caracter unidades*/

int aux_get_s;

/* Inicialmente se emite ATB5 que supone una velocidad de 1200 baudios-----------------------------------------------------------------------------------------*/while (result_s=='0') /* Mientras recibe OK (0)*/

{data_trans=1; /* Para enviar primer dato a UART*/ data_U++; if ((data_U>'9')&&(data_D==' '))

{data_U='0'; data_D='1';}

/* Seguidamente se emite la siguiente secuencia: ATV0Bxx------------------------------------------------------------------------*/if (manda_dato('A')==-1)

return(-1);if (manda_dato('T')==-1)

return(-1);if (manda_dato('V')==-1)

return(-1);if (manda_dato('0')==-1)

return(-1);if (manda_dato('B')==-1)

return(-1);

Page 110: Comunicación de dos ordenadores mediante el …deeea.urv.cat/public/PROPOSTES/pub/pdf/517pub.pdf · sistema de comunicaciones es captar señales digitales y modularlas para la emisión

7. ANEXO 1: ALGORITMO Comunicación de dos ordenadores con protocolo x-módem

108

if (manda_dato(data_D)==-1)return(-1);

if (manda_dato(data_U)==-1)return(-1);

for(aux_get_s=0;aux_get_s<5;aux_get_s++)if (manda_dato(' ')==-1) /* Para evitar confusion entre cod respuesta y car emitido*/

return(-1);if (manda_dato(CR)==-1) /* Char 13 -> Retorno carro*/

return(-1);if (recibe_dato(&result_s)==-1) /* Recibe resultado del comando emitido*/

return(-1);/* Realiza lectura hasta recibir respuesta debido a que

usa mismo registro de emision y recepcion*/while ((result_s!='0')&&(result_s!='4'))

if (recibe_dato(&result_s)==-1)return(-1);

pausa_tic(8); /* Realiza pausa para descargar linea*/}

if (result_s=='4') /* Recepcion de error (4)*/{if ((data_U=='0')&&(data_D=='1'))

{data_U='9'; data_D='0';}

elsedata_U--;

}if (data_D==' ')

data_D='0';return(trans_int(data_U,data_D)); /* Devuelve Divisor vel. Especifica*/}

int trans_int(unsigned char uni,unsigned char dec){/*************************************************************************************** OBJETIVO: Suministrar el valor de Divisor (valor que se introduce en registro de MODEM para determinar velocidad. VARIABLES ENTRADA:

- uni: Representa las unidades- dec: Representa las decenas

VARIABLES SALIDA:- La funcion retorna el equivalente numerico al representado por el conjunto de

caracteres.***************************************************************************************//* Conversion a valor numerico (‘0’ = 48)--------------------------------------------------*/switch(10*(dec-48)+uni-48)

{case 5: {return(96);} /* 1200 baudios*/ case 6: {return(48);} /* 2400 baudios*/ case 7: {return(24);} /* 4800 buadios*/ case 8: {return(12);} /* 9600 baudios*/ case 9: {return(12);} /* 9600 baudios*/ case 10:{return(12);} /* 9600 baudios*/ case 11: {return(6);} /* 19200 baudios*/ case 12: {return(6);} /* 19200 baudios*/ case 13: {return(6);} /* 19200 baudios*/ case 14: {return(6);} /* 19200 baudios*/ case 15: {return(6);} /* 19200 baudios*/ default:{return(-1);} /* Informa error*/}

}

Page 111: Comunicación de dos ordenadores mediante el …deeea.urv.cat/public/PROPOSTES/pub/pdf/517pub.pdf · sistema de comunicaciones es captar señales digitales y modularlas para la emisión

7. ANEXO 1: ALGORITMO Comunicación de dos ordenadores con protocolo x-módem

109

/************** FUNCIONES RELACIONADAS CON EL CONTADOR DE TIEMPO **************/void pausa_seg(int sss){/*************************************************************************************** OBJETIVO: Realizar una pausa de "sss" segundos.***************************************************************************************/

reset_timer(); /* Reset del contador timer*/while (seg<=sss); /* Sale cuando llega al tiempo especificado*/

}

void pausa_tic(int ttt){/*************************************************************************************** OBJETIVO: Realizar una pausa de "ttt" tics. (1 tic=1/18) seg.***************************************************************************************/reset_timer(); /* Reset del contador timer*/while (tic<=ttt); /* Sale cuando llega al tiempo especificado*/}

void reset_timer(void){/*************************************************************************************** OBJETIVO: Poner a 0 los contadores del timer.***************************************************************************************/tic=0;seg=0;min=0;timeout=0;}

/*********************** FUNCIONES DE FINALIZACION DEL SISTEMA ********************/

void fin_system(void){/*************************************************************************************** OBJETIVO: Finalizar el sistema dejandolo en el estado en que se encontraba justa antes de ejecutar este programa.***************************************************************************************/int pp_x=getmaxx()/2-220, /* Cordenada X linea*/

pp_y=getmaxy()/3; /* Cordenada Y linea*/struct date fecha;

colgar_modem(); /* Corta conexion (si la hay)*/clearviewport(); /* Limpia screen*/setbkcolor(BLUE);setcolor(WHITE);setfillstyle(1,LIGHTGRAY);moveto(pp_x,100);outtext("GRACIAS POR SU ATENCION..."); /* Mensaje de despedida*/getdate(&fecha);gotoxy(57,25);printf("%d/%d/%d",fecha.da_day,fecha.da_mon,fecha.da_year);reset_timer();while (seg<5) /* Dibuja barra durante 5 seg.*/

bar(pp_x,2*pp_y-20,pp_x+107*seg,2*pp_y-17);closegraph(); /* Finaliza tarjeta de video*/setvect(VECT_KEYBOARD,oldhandler_kb); /* Asigna antigua subrutina at. Int*/setvect(VECT_CLOCK,oldhandler_clk); /* Asigna antigua subrutina at. Int*/}

Page 112: Comunicación de dos ordenadores mediante el …deeea.urv.cat/public/PROPOSTES/pub/pdf/517pub.pdf · sistema de comunicaciones es captar señales digitales y modularlas para la emisión

7. ANEXO 1: ALGORITMO Comunicación de dos ordenadores con protocolo x-módem

110

void fin_kb(void){/*************************************************************************************** OBJETIVO: Asignar la direccion asociada a la antigua subrutina de atencion a la interrupcion del teclado.***************************************************************************************/setvect(VECT_KEYBOARD,oldhandler_kb); /* Asignacion direccion antigua subrutina*/}

void colgar_modem(void){/*************************************************************************************** OBJETIVO: Cortar enlace de comunicacion entre los dos sistemas.***************************************************************************************/outportb(B_UART+4,inportb(B_UART+4)&0xFE); /* DTR -->0*/}

Page 113: Comunicación de dos ordenadores mediante el …deeea.urv.cat/public/PROPOSTES/pub/pdf/517pub.pdf · sistema de comunicaciones es captar señales digitales y modularlas para la emisión

7. ANEXO 2: La UART 82C50A Comunicación de dos ordenadores con protocolo x-módem

111

ANEXO 2. La UART 82C50A

ÍNDICE

1. Introducción pág. 112

2. Recepción de datos pág. 113

3. Transmisión de datos pág. 113

4. Acceso a los registros pág. 114

5. Registros de Estado pág. 114

5.1. Formato del registro LSR pág. 115

5.2. Formato del registro MSR pág. 116

6. Registros de Control pág. 117

6.1. El registro IER pág. 117

6.2. El registro IIR pág. 119

6.3. El registro LCR pág. 119

6.4. El registro MCR pág. 121

7. Registros de datos pág. 122

8. Registros de configuración pág. 122

Page 114: Comunicación de dos ordenadores mediante el …deeea.urv.cat/public/PROPOSTES/pub/pdf/517pub.pdf · sistema de comunicaciones es captar señales digitales y modularlas para la emisión

7. ANEXO 2: La UART 82C50A Comunicación de dos ordenadores con protocolo x-módem

112

1. Introducción

Un dispositivo UART es un periférico utilizado para la emisión y recepción de datosde forma serie.

UART es una abreviatura de Universal Asynchronous Receiver/Transmitter, quetraducido al castellano significa Receptor / Transmisor Asíncrono Universal.

El funcionamiento básico de este dispositivo es equiparable a un sistema PISO(Parallel Input Serial Output) o SIPO (Serial Input Parallel Output) según se encuentrerecibiendo datos o emitiéndolos por la línea serie.

El 82C50A es un Elemento de Comunicación Asíncrona (ECA) que disponeinternamente de una UART y de un BRG (Baud Rate Generator), es decir, un Generadorde Baudios que marca la velocidad de entrada o salida de los bits que viajan por la líneaserie.

Existe una señal de salida denominada BAUDOUT. Esta señal se compone de unconjunto de pulsos con una frecuencia igual a la frecuencia del cristal entre el valorprogramable existente en los registros DLL (Divisor Latch LSB) y DLM (Divisor LatchMSB).

La velocidad de salida de los datos resulta ser justamente la fracción de la frecuenciade la señal BAUDOUT entre 16. De este modo se obtiene velocidades según el estándarANSI/CCITT siempre que se utilice uno de los tres cristales estandarizados de 1’8432MHz, 2’4576 MHz o 3’072 Mz.

De los dos apartados anteriores, podemos deducir las siguientes fórmulas quepermitirán conocer la velocidad de salida de los datos:

[ ]

[ ]bpsN

fBAUDOUTV

HzN

fBAUDOUT

CLKD

CLK

⋅==

=

1616

cristal del Frecuencia DLMy DLL de Contenido

≡∀≡∀

CLKfN

Seguidamente se presenta un diagrama de bloques que trata de informar de lasdiferentes partes que constituyen el dispositivo.

Figura 1. Diagrama de Bloques.

Page 115: Comunicación de dos ordenadores mediante el …deeea.urv.cat/public/PROPOSTES/pub/pdf/517pub.pdf · sistema de comunicaciones es captar señales digitales y modularlas para la emisión

7. ANEXO 2: La UART 82C50A Comunicación de dos ordenadores con protocolo x-módem

113

2. Recepción de datos

La recepción en serie de datos se realiza por la línea SIN. En estado inactivo, la líneaserie de entrada se encuentra en estado lógico alto. En el momento en que se detecta unflanco negativo (paso de estado alto a bajo) un contador precargado a cero inicia su cuentatemporal hasta llegar al tiempo en que se encuentra en el punto medio del bit de inicio. Porende, se considera correcto el bit de inicio si la señal existente en la línea SIN se mantieneen estado lógico bajo hasta que se ha transmitido la mitad de este bit. De esta forma seevita la confusión que puede ocasionar posibles ruidos en la línea.

En el registro LCR (Line Control Register) se determina el formato de la trama debits a recibir, es decir, si el dato enviado es de cinco, seis, siete u ocho bits, si el número debits de parada es de 1, 1’5 o 2, y si existe o no bit de paridad, y en caso afirmativo,determinar el tipo.

Cuando el dato se transmite por la línea serie de entrada SIN, se almacena en elregistro RSR (Receiver Shift Register). Posteriormente se transmite al registro RBR(Receiver Buffer Register). Una vez completado el proceso y cargado el RBR, el bit DR(Data Received) se aserta informando de la presencia de ese dato en el registro receptor.

En el caso en que un nuevo dato se introduzca por la línea serie antes de completar latransferencia desde el RSR al RBR, se produce un error de sobreescritura. En este caso seaserta el bit OE (Overrun Error) presente en el registro LSR (Line Status Register).

Como control de error en la trama de datos, es útil el bit de paridad puesto reduce laprobabilidad de obtener un dato erróneo entre el registro RSR y el RBR. Debido a la cortadistancia que separa los dos registros, es un sistema de detección de error válido ya que esdifícil obtener más de un bit anómalo en toda la trama. Si existe caso de error de paridad, elbit PE (Parity Error) presente en el LSR se aserta.

En el chip existe un circuito destinado a observar el estado en que se encuentra el bitde paro de trama. En caso de no encontrarse en estado lógico alto, se aserta el bit FE(Framing Error) para indicar que el bit de paro no se ha recibido.

3. Transmisión de datos

La sección que constituye la transmisión de datos consiste en los registros THR(Transmitter Holding Register) y TSR (Transmitter Shift Register), además de la lógicaasociada al control.

El THRE (Transmitter Holding Register Empty) y el TEMT (Transmitter Shift RegisterEmpty) son dos bits presentes en el registro de estado de la línea (LSR) e informan sobre elestado de esos dos registros.

El proceso de transmisión se inicia cuando una palabra (de cinco a ocho bits) seescribe a través del bus de datos al THR. Este proceso solo se permitirá en el caso queTHRE esté en estado alto, lo cual indicará que el registro THR se encuentra vacío y portanto listo para la recepción de datos desde el búfer del bus de datos.

Al efectuar la escritura sobre el registro THR, el bit THRE cambia a estado bajo y novuelve a estado alto hasta no haber finalizado la transferencia. Posteriormente el dato setransmite de forma serie al TSR. Eso provoca que el bit TEMT permanezca en estado bajohasta que el último bit se encuentre fuera del TSR.

Page 116: Comunicación de dos ordenadores mediante el …deeea.urv.cat/public/PROPOSTES/pub/pdf/517pub.pdf · sistema de comunicaciones es captar señales digitales y modularlas para la emisión

7. ANEXO 2: La UART 82C50A Comunicación de dos ordenadores con protocolo x-módem

114

4. Acceso a los registros

El acceso a los registros viene definido por el valor que tome las variables dedireccionamiento A2-A0.

En la siguiente tabla se presenta la dirección de cada registro:

DLAB A2 A1 A0 NEMOTÉCNICO REGISTRO

0 0 0 0 RBR Registro Búfer Receptor

0 0 0 0 THR Registro Tenencia Transmisor

0 0 0 1 IER Registro Interrupción Activa

X 0 1 0 IIR Registro Identificación Interrupción

X 0 1 1 LCR Registro Control Línea

X 1 0 0 MCR Registro Control Módem

X 1 0 1 LSR Registro Estado Línea

X 1 1 0 MSR Registro Estado Módem

X 1 1 1 SCR Registro Bloc Notas

1 0 0 0 DLL Divisor Latch (LSB)

1 0 0 1 DLM Divisor Latch (MSB)

Tabla 1. Acceso a los registros.

DLAB (Divisor Latch Access Bit) es un bit que se encuentra en el registro LCR comose verá posteriormente. Este dispositivo multiplexa mediante el valor de ese bit paraefectuar la programación del Generador de Baudios o el acceso a los Registros de Datos.

Se distinguen cuatro tipos de registros claramente diferenciados:

• Registros de Estado

• Registros de Control

• Registros de Datos

• Registros de Configuración

5. Registros de Estado

Los Registros de Estado existentes en el chip son el LSR (Line Status Register) y elMSR (Modem Status Register).

El Registro Estado Línea (LSR) es un registro de ocho bits que suministrainformación sobre el estado actual en que se encuentra la línea serie, es decir, es un registroesencial para conocer la causa que ha provocado una determinada interrupción.

La llamada de una interrupción en el dispositivo puede tener diversos orígenes: errorde datos recibidos o registros de datos preparados para lectura o escritura.

El registro MSR informa sobre el estado en que se encuentra el módem, indicando siestá listo para intercambiar datos con la UART, si ha establecido comunicación con otromódem o si existe una llamada entrante.

Page 117: Comunicación de dos ordenadores mediante el …deeea.urv.cat/public/PROPOSTES/pub/pdf/517pub.pdf · sistema de comunicaciones es captar señales digitales y modularlas para la emisión

7. ANEXO 2: La UART 82C50A Comunicación de dos ordenadores con protocolo x-módem

115

5.1. Formato del registro LSR

Figura 2. Formato del registro LSR.

LSR(0) Dato preparado (DR): Bit que se ubica en estado alto cuando un dato estácargado en el RBR. Se sitúa en estado bajo por la CPU tras la lectura de ese registro.

LSR(1) Error de sobreescritura (OE): Bit que pasa a estado alto debido a unasobreescritura de datos en el registro RBR. La no lectura del registro por parte de la CPU yla llegada de nuevos datos del exterior provocan este error. El reset de este bit se efectúatras la lectura del LSR.

LSR(2) Error de paridad (PE): Bit indicativo de la existencia de error de paridaden la transmisión de datos desde el RSR al RBR. La lectura del registro LSR provoca elreset de este bit.

LSR(3) Error de fórmula (FE): Bit informativo de error en la llegada del bit deparo, lo que indica error en la recepción de datos. La lectura del registro LSR provoca elreset de este bit.

LSR(4) Recepción carácter break (BI): Bit que informa de la recepción de uncarácter Break. Un carácter Break es un dato invalido que se mantiene en estado bajodurante más tiempo que el requerido para la recepción de toda la trama de bits (start bit +string data + parity bit +stop bit). El reset de este bit se efectúa mediante la lectura delLSR.

LSR(5) THR vacío (THRE): Bit indicativo de que el registro de transmisión seencuentra vacío y por tanto disponible para ser cargado con el propósito de efectuar unanueva transmisión. Se efectúa el reset de este bit mediante la carga del registro THR.

LSR(6) THR y TSR vacíos (TEMT): Bit que informa de la inexistencia de datos enel THR y en el TSR. Este bit pasa a estado bajo cuando el registro THR es cargado ypermanece así hasta que el último bit de datos se encuentra fuera del TSR.

LSR(7) No utilizado.

Page 118: Comunicación de dos ordenadores mediante el …deeea.urv.cat/public/PROPOSTES/pub/pdf/517pub.pdf · sistema de comunicaciones es captar señales digitales y modularlas para la emisión

7. ANEXO 2: La UART 82C50A Comunicación de dos ordenadores con protocolo x-módem

116

5.2. Formato del registro MSR

Figura 3. Formato del registro MSR.

MSR(0) Cambio en CTS (DCTS): Bit informativo del cambio de estado del bitCTS (Clear To Send) desde la última lectura del MSR por parte de la CPU.

MSR(1) Cambio en DSR (DDSR): Bit informativo del cambio de estado del bitDSR (Data Set Ready) desde la última lectura del MSR por parte de la CPU.

MSR(2) Cambio en RI (TERI): Bit informativo del cambio de estado del bit RI(Ring Indicator) desde la última lectura del MSR por parte de la CPU.

MSR(3) Cambio en DCD (DDCD): Bit informativo del cambio de estado del bitDCD (Data Carrier Detect) desde la última lectura del MSR por parte de la CPU.

MSR(4) Listo para enviar (CTS): Bit informativo sobre el estado en que seencuentra el módem para recibir los datos desde la UART. En caso de encontrarseasertado, indica que el módem está listo para transmitir datos a otro módem ubicado enlontananza.

MSR(5) Lista para recibir (DSR): Bit informativo sobre el estado en que seencuentra el módem para enviar datos hacia la UART. En caso de encontrarse asertado,indica que el módem está listo para la recepción de datos proveniente de otro módemubicado en lontananza.

MSR(6) Indicador de llamada (RI): Bit informativo sobre el estado de la entradaRI que detecta una señal de llamada. En caso de recibir una llamada, RI se pone en estadoalto.

MSR(7) Portadora detectada (DCD): Bit indicativo de la detección de portadora, ypor tanto, informativo sobre una comunicación establecida con otro módem.

Page 119: Comunicación de dos ordenadores mediante el …deeea.urv.cat/public/PROPOSTES/pub/pdf/517pub.pdf · sistema de comunicaciones es captar señales digitales y modularlas para la emisión

7. ANEXO 2: La UART 82C50A Comunicación de dos ordenadores con protocolo x-módem

117

6. Registros de Control

Los Registros de Control existentes en el dispositivo 82C50A son el IER (InterruptEnable Register), el IIR (Interrupt Identification Register), LCR (Line Control Register) yel MCR (Modem Control Register).

Los registros LCR y MCR determinan el control sobre la línea serie y el módem.

Los registros IER e IRR son fundamentales para posibilitar las peticiones deinterrupción y esclarecer la causa de esa petición.

El chip 82C50A establece una jerarquía entre las diferentes causas que ocasionan unainterrupción. Los cuatro niveles de existentes son los siguientes:

• Estado de la línea serie (prioridad 1)

• Dato listo en RBR (prioridad 2)

• THR vacío (prioridad 3)

• Estado del módem (prioridad 4)

6.1. El registro IER

El IER es el registro que posibilita las diferentes fuentes de interrupción que puedenexistir en el dispositivo. Se puede establecer un logigrama de la estructura de control deinterrupciones:

Figura 3. Estructura de control de Interrupciones.

Como puede observarse en la figura anterior, el estado de los bits presentes en esteregistro marcan la llave de acceso a la posibilidad de petición de una determinadainterrupción. En caso que exista permiso por parte de éstos, la línea INTRPT informa alControlador de Interrupciones en el momento preciso.

Page 120: Comunicación de dos ordenadores mediante el …deeea.urv.cat/public/PROPOSTES/pub/pdf/517pub.pdf · sistema de comunicaciones es captar señales digitales y modularlas para la emisión

7. ANEXO 2: La UART 82C50A Comunicación de dos ordenadores con protocolo x-módem

118

Figura 4. Formato del registro IER.

IER(0) Interrupción RBR cargado (ERBFI): Bit de control que establece laposibilidad efectuar interrupciones debido a la carga del registro RBR.

IER(1) Interrupción THR vacío (ETBEI): Bit de control que establece laposibilidad de efectuar interrupciones debido a la finalización de la emisión de un dato enel momento en que THR se vacía.

IER(2) Interrupción Estado Línea (ELSI): Bit que controla la posibilidad deefectuar interrupciones debido a errores en la recepción de datos por la línea serie o por laexistencia de una llamada entrante.

IER(3) Interrupción Estado Módem (EDSSI): Bit que establece el control en lapetición de interrupciones debido a cambios de estado en el módem. Permitiendo este nivelde interrupción, se puede considerar el momento en que se establece comunicación conotro módem, además de poder considerar cambios en las variables de control de flujo.

IER(4,5,6,7) No utilizado.

Page 121: Comunicación de dos ordenadores mediante el …deeea.urv.cat/public/PROPOSTES/pub/pdf/517pub.pdf · sistema de comunicaciones es captar señales digitales y modularlas para la emisión

7. ANEXO 2: La UART 82C50A Comunicación de dos ordenadores con protocolo x-módem

119

6.2. El registro IIR

El IIR es el registro que identifica el motivo de petición de interrupción. Como secomentó anteriormente, el dispositivo mantiene una jerarquía de actuación en el caso depercibir diversas fuentes de interrupción al mismo tiempo. Así, en este registro siemprefigurará el tipo de interrupción más prioritaria entre las posibles (según se configure elIER). Por ende, si existen interrupciones pendientes, no serán reconocidas hasta que sehaya servido la petición más prioritaria.

Este registro utiliza únicamente los tres bits de menor peso para determinar la causaque ha impulsado a la petición de interrupción. Los demás bits no se utilizan y se debenmantener a ‘0’.

En la siguiente tabla se expresa la decodificación de los bits para determinar el nivelde prioridad. También muestra las fuentes que ocasionan las diferente interrupciones y laforma de realizar el reset de las mismas.

BIT 2 BIT 1 BIT 0 NIVEL FUENTE RESET

X X 1

1 1 0 1 OE, PE, FE, o BI Lectura LSR

1 0 0 2 Dato recibido Lectura RBR

0 1 0 3 THRE Escritura en THR.

Lectura IIR

0 0 0 4 CTS, DSR, RI, DCD Lectura MSR

Tabla 2. Identificación de Interrupción.

6.3 El registro LCR

El registro LCR establece el formato del dato a emitir o recibir. El contenido de esteregistro se detalla seguidamente:

Figura 5. Formato del registro LCR.

Page 122: Comunicación de dos ordenadores mediante el …deeea.urv.cat/public/PROPOSTES/pub/pdf/517pub.pdf · sistema de comunicaciones es captar señales digitales y modularlas para la emisión

7. ANEXO 2: La UART 82C50A Comunicación de dos ordenadores con protocolo x-módem

120

LCR(0) – LCR(1) Longitud de palabra:.Estos dos bits establecen la longitud deldato a transmitir o recibir siguiendo la siguiente codificación:

LCR(0) LCR(1) LONGITUD PALABRA

0 0 5 Bits

0 1 6 Bits

1 0 7 Bits

1 1 8 Bits

Tabla 3. Codificación de longitud de palabra

LCR(2) Bit de Stop: Bit que establece el número de bits de final de trama de bits.En caso de situarse en ‘0’ lógico tratará con 1 bit de paro en el dato transmitido. Empero, sise sitúa en ’1’ lógico se insertará 1’5 bits de paro cuando tratemos con palabras de 5 bits.En caso que se trate con palabras de longitud superior (6-8 bits), el sistema genera 2 bits deparo.

LCR(3) Activa paridad: Este bit indica al sistema del deseo de introducir un bit deparidad que tiene como objetivo detectar un posible error introducido en la trama de datos.Ese bit se genera si este bit se sitúa en estado alto.

LCR(4) Paridad Par: Bit indicativo del tipo de paridad que se utilizará en caso quelo permita el bit LCR(3). Un ‘1’ lógico indica la utilización de paridad par , en caso devaler un ‘0’ lógico, se utilizará paridad impar.

LCR(5) Stick Parity : En caso de encontrarse en estado lógico alto, causa latransmisión de un bit de paridad en un estado opuesto al indicado por el LCR(4). Lautilidad de este bit es permitir al usuario forzar la paridad a un estado conocido y para queel receptor asegure que no hay error en el bit de paridad.

LCR(6) Set Break: El estado de este bit determina la emisión de un carácter Breakhacia el receptor. Como se comentó anteriormente, un carácter Break es un carácterinvalido que permanece en la línea serie en estado lógico ‘0’ durante más tiempo queprecisa toda la trama de bits (incluyendo el bits de control). El propósito de este carácter esalertar a la CPU de la presencia de un sistema de comunicaciones.

LCR(7) Acceso Divisor Latch: El acceso a los registros de datos THR y RBR estámultiplexado con el acceso a los registro de configuración DLL y DLM cuyo valor esfundamental para establecer la velocidad de los datos transmitidos o enviados. Elcontrolador de esa selección es este bit, que permitiendo el acceso a los registros de datoscuando este bit se encuentra en estado lógico ‘0’. De forma contraria, permite el acceso alos registros de configuración.

Page 123: Comunicación de dos ordenadores mediante el …deeea.urv.cat/public/PROPOSTES/pub/pdf/517pub.pdf · sistema de comunicaciones es captar señales digitales y modularlas para la emisión

7. ANEXO 2: La UART 82C50A Comunicación de dos ordenadores con protocolo x-módem

121

6.4. El registro MCR

Este registro de escritura o lectura realiza un control directo sobre las variables deentrada al módem. El formato de este registro se describe seguidamente:

Figura 6. Formato del registro MCR.

Cabe notar que las señales a las que incumbe el estado de estos bits, se encuentranconfiguradas en lógica negada. Por ende, una señal asertada deberá valer un ‘0’ lógico apesar de que el bit de control ubicado en el registro tenga lógica positiva.

MCR(0) Terminal Datos Preparado (DTR): Bit informativo del estado en que seencuentra el DTE del sistema de comunicaciones. En caso de constar un ‘1’ lógico en estaposición, indicará al módem que el terminal de datos se encuentra preparado para latransferencia de datos.

MCR(1) Petición Envío (RTS): Bit que tiene el propósito de indicar el deseo deiniciar la transmisión de un dato hacia el módem. Si éste se encuentra preparado seinformará al DTR mediante la señal CTS (MSR(4)). De este modo se realiza el control deflujo de datos entre DCE y DTE.

MCR(2) Salida 1 (OUT1): Bit de control sobre la línea !OUT1 que sirve paraseleccionar el DCE 1.

MCR(3) Salida 2 (OUT2): Bit de control sobre la línea !OUT2 que sirve paraseleccionar el DCE 2. Normalmente esta línea activa el módem para cometer latransmisión de datos. Por tanto es imprescindible la activación de esta línea.

MCR(4) Lazo: Bit controlador de suministro de lazo cerrado para realizar tareas depronóstico y chequeos del sistema. En caso de situar este bit a ‘1’, provoca la ubicación aestado lógico 1 de la salida SOUT y la desconexión de la línea de entrada SIN con elpropósito de mandar los datos desde el TSR al RSR creando así un lazo cerrado entre losregistros de entrada y salida.

LCR(5,6,7) No utilizado.

Page 124: Comunicación de dos ordenadores mediante el …deeea.urv.cat/public/PROPOSTES/pub/pdf/517pub.pdf · sistema de comunicaciones es captar señales digitales y modularlas para la emisión

7. ANEXO 2: La UART 82C50A Comunicación de dos ordenadores con protocolo x-módem

122

7. Registros de Datos

Los Registros de Datos vienen representados por el RBR (Receiver Buffer Register),el THR (Transmitter Holding Register) y el SCR (Scratch Register).

El registro de recepción de datos (RBR) recibe la información de forma serie desdeel RSR (Receiver Shift Register), registro al que le llegan los datos por la señal de datosSIN. Este doble búfer de datos permite la recepción de un nuevo carácter mientras existeotro en el RBR. Como ya se comentó, en caso de cometerse una escritura en el RBR antesde haber leído, el bit OR indicará el error de sobreescritura, borrando el dato recibido.

El registro de transmisión de datos (THR) transmite los 8 bits de datos hacia el TSR(Transmitter Shift Register), registro que manda los datos de forma serie por la líneaSOUT.

El SCR únicamente tiene la finalidad de mantener datos temporalmente para ayudaral programador a realizar sus tareas algorítmicas. La longitud de este registro es de 8 bits.

La particularidad de los registros THR y RBR es que se encuentran en la mismadirección física. Por tanto, el acceso al registro THR se realizará mediante una lectura a ladirección correspondiente; de forma contraria, el acceso al registro RBR se realizarámediante una escritura.

8. Registros de Configuración

Los registros de configuración vienen representados por los registros de selección develocidad de viaje de los datos. Existen dos registros que determinan un valor conocidocomo Divisor Latch, éstos son el DLL (Divisor Latch LSB) y el DLM (Divisor LatchMSB), es decir, se trata de un valor de 16 bits que viene determinado por su byte bajo(LSB) y otro alto (MSN).

Tal como se mencionó en el apartado 2.4.1. Introducción, la velocidad de datos desalida viene determinado por las operaciones siguientes:

[ ]

[ ]bpsN

fBAUDOUTV

HzN

fBAUDOUT

CLKD

CLK

⋅==

=

1616

cristal del Frecuencia DLMy DLL de Contenido

≡∀≡∀

CLKfN

Si ponemos como ejemplo que deseamos transmitir datos a una velocidad de 9600baudios y utilizamos un cristal de 1’8432 MHz, el valor a cargar en DLL y DLM será:

==

⇒==⋅

⋅=

⋅=⇒

⋅=

0000000000001100

12960016

108432'1

16166

DLMDLL

CN

Vf

NN

fV

HEX

D

CLKCLKD

Page 125: Comunicación de dos ordenadores mediante el …deeea.urv.cat/public/PROPOSTES/pub/pdf/517pub.pdf · sistema de comunicaciones es captar señales digitales y modularlas para la emisión

7. ANEXO 3: La RS-232 Comunicación de dos ordenadores con protocolo x-módem

123

ANEXO 3: LA RS-232.

ÍNDICE

• Introducción pág. 124

• Aspectos mecánicos pág. 124

• Aspectos Eléctricos pág. 125

• Aspectos Funcionales pág. 125

Page 126: Comunicación de dos ordenadores mediante el …deeea.urv.cat/public/PROPOSTES/pub/pdf/517pub.pdf · sistema de comunicaciones es captar señales digitales y modularlas para la emisión

7. ANEXO 3: La RS-232 Comunicación de dos ordenadores con protocolo x-módem

124

Introducción

La norma serie RS232 fue diseñada para conectar DTEs (Data TerminalEquipment) o terminales de datos con DCEs (Data Communication Equipment) oequipos de comunicación de datos.

La RS232 permite la transmisión sincronía y asíncrona. La subnorma asíncrona essin duda la más frecuente por lo que nos centraremos en ella.

En la comunicación asíncrona, además del bit de START utiliza:

• 5, 6, 7 ó 8 bits de datos

• 0 ó 1 bit de paridad

• 1, 1’5 ó 2 bits de STOP

Para agilizar el lenguaje se suele emplear una nomenclatura abreviada como, porejemplo, “8N1” que indica que la transmisión serie RS232 se ha configurado paratransmitir 8 bits de datos, No paridad y 1 bit de STOP. Otro ejemplo sería “6E2” queindica 6 bits de datos, paridad par y 2 bits de STOP.

El estándar RS-232 normaliza los aspectos mecánicos, eléctricos y funcionales:

Aspectos Mecánicos

La RS-232 utiliza un conector Cannon DB-25 (ISO 2110) macho para el DTE yhembra para el DCE.

La conexión entre DTE y DCE es simple. Cada pin conecta con su par (el 1 con el1, el N con el N) existen versiones de DB-25 para cable plano que simplifica elmecanizado de las conexiones. Cada pin tiene asignado una función tal y como semuestra en la figura. Los nombres de las líneas están puestos desde el punto de vista delDTE. Así, el pin 2 es la línea TxD (transmisión de datos) pero obviamente eso no es

Page 127: Comunicación de dos ordenadores mediante el …deeea.urv.cat/public/PROPOSTES/pub/pdf/517pub.pdf · sistema de comunicaciones es captar señales digitales y modularlas para la emisión

7. ANEXO 3: La RS-232 Comunicación de dos ordenadores con protocolo x-módem

125

cierto en ambos equipos, sólo en el DTE. En el DCE, por el contrario, es la línea por laque recibe los datos del DTE. Cuando sólo se utiliza la transmisión asíncrona, sólo esnecesario utilizar nueve líneas. Se puede utilizar el conector Cannon-DB-9. Igualmente elmacho es el DTE y la hembra el DCE. (Desgraciadamente esta norma, y otras de laRS232, no siempre es seguida por todos los fabricantes, razón por la cual no siempre esfácil manejar esta interface).

La longitud máxima del cable entre DTE y DCE depende de la calidad de éste y dela velocidad de transmisión utilizada. En principio la norma recomienda que no seasuperior a 15 metros para una velocidad de 20 Kbits/seg.

Aspectos Eléctricos

La subnorma eléctrica de la RS232 es la V28. La norma fija una transmisión enmodo común (cada circuito tienen una referencia a tierra y esta es común para todos loscircuitos). Los circuitos son punto a punto, es decir, un driver con un sólo receptor de laseñal.

La señal es bipolar con lógica invertida, utilizando los siguientes valores:

• 1 lógico =-3 a - 15 voltios• 0 lógico = + 3 a + 15 voltios

La ausencia de señal (0 voltios) queda diferenciado del 0 y 1 lógicos. La RS232 escortocircuitable. Esto quiere decir que, al menos teóricamente, los drivers de salida de laspuertas disponen de un mecanismo de auto-protección contra sobrecalentamientos. Latensión máxima de operación es +/-25voltios y la carga máxima es de 3 Kohm. a 7Kohm., con una corriente máxima de 500 mA.

Aspectos FuncionalesLa norma asíncrona la forman nueve líneas.

La línea GND conecta la masa de ambos equipos y no merece mayor comentario.

Page 128: Comunicación de dos ordenadores mediante el …deeea.urv.cat/public/PROPOSTES/pub/pdf/517pub.pdf · sistema de comunicaciones es captar señales digitales y modularlas para la emisión

7. ANEXO 3: La RS-232 Comunicación de dos ordenadores con protocolo x-módem

126

Las restantes ocho líneas pueden ser agrupados en tres bloques funcionales que seexplican fácilmente si recordamos que la norma fue diseñada para conectar un PC (DTEtípico) con un módem (DCE típico).

• Primer bloque: Lo denominaremos "de establecimiento de conexión". Estáformado por las líneas:

o DTR (Data Terminal Ready). Terminal de datos preparado. (El PC y suRS232 están listos).

o DSR (Data Set Ready). Equipo de comunicación preparado. (El módemestá listo).

o RI (Ring Indicator). Indicador de llamada. (El módem indica a su PC queha recibido una llamada).

El objetivo es que ambos PCs sepan que se ha establecido un canal decomunicación(normalmente a través de la línea telefónica).Las líneas DTR y DSR del equipo local y del remoto deben estar activas (set)durante todo el proceso. (De hecho cuando un PC desea dar por terminada unaconexión basta con que, momentáneamente, desactive (reset) su DTR).La conexión se inicia manualmente (el usuario llama con el teléfono al módemremoto) o automáticamente (el módem tiene capacidad de marcar un número deteléfono – dialling) y se gestiona en los módems (que negocian, de formaautomática, los parámetros de transferencia como la velocidad, compresión, etc).Se asume que el usuario del PC que llama activará el proceso que va a utilizar laconexión (un programa de transmisión de ficheros, por ejemplo). En el PCllamado se asume que el proceso homólogo está ya activo (porque, p.e., lo estápermanentemente) o se puede activar automáticamente al recibir de su módem laseñal de RI. Sea como fuera, laconexión queda establecida. A partir de este momento los PCs puedenintercambiar información.

• Segundo bloque: "Control de flujo".Estas líneas tienen sentido en el caso de que el canal de comunicación establecidotenga una gestión half-duplex (ver a continuación “gestión simplex, half-duplex yfull-duplex...”).Si el canal está establecido, el protocolo software de nivel de enlace de datos quese esté utilizando (X-MODEM, Y-MODEM, HDLC,...) fijará cuál de los dosDTEs debe comenzar a hablar/transmitir.Las líneas en este bloque son usadas de la siguiente manera:

o RTS (Request To Send). Petición de transmisión. El PC indica a sumódem que quiere transmitir a la máquina remota.

o CTS (Clear To Send). Canal libre para la transmisión. El módem indica asu PC que puede transmitir. Previamente habrá transmitido una señalportadora por el canal de comunicación para avisar al otro módem queocupa el canal.

Page 129: Comunicación de dos ordenadores mediante el …deeea.urv.cat/public/PROPOSTES/pub/pdf/517pub.pdf · sistema de comunicaciones es captar señales digitales y modularlas para la emisión

7. ANEXO 3: La RS-232 Comunicación de dos ordenadores con protocolo x-módem

127

o DCD (Data Carrier Detected). Detectada portadora. El módem indica a suPC que el canal de comunicación está ocupado por el equipo remoto.

El PC que quiere transmitir activa RTS, entonces su módem manda una señalportadora (sin modular, sin datos) para avisar al módem remoto que se reserva elcanal. Una vez reservado el canal comunica a su DCE que ya puede transmitiractivando la línea CTS.Cuando un PC haya terminado de transmitir, desactivará RTS, el módem quitarála portadora y desactivará CTS. Entonces el otro módem podrá reservar el canal sisu PC desea transmitir.En caso de que la gestión del canal sea full-duplex todo es más sencillo. Cuandoun PC quiere transmitir activa su RTS. Automáticamente su módem le da pasoactivando CTS.

• Tercer Bloque: “Transmisión/recepción de datos”.El funcionamiento de las líneas de este bloque es obvio. Cuando un PC puedetransmitir, lo hace por la línea

o TxD. Transmisión de datos....y si está recibiendo datos lo hace por

o RxD. Recepción de datosLa transmisión serial de los datos, tal y como se ha explicado, con el bit de START,deSTOP, etcétera, se produce en estas líneas.

Page 130: Comunicación de dos ordenadores mediante el …deeea.urv.cat/public/PROPOSTES/pub/pdf/517pub.pdf · sistema de comunicaciones es captar señales digitales y modularlas para la emisión

CONCLUSIONES Comunicación de dos ordenadores con protocolo x-módem

CONCLUSIONES

Tras la realización del presente proyecto, se puede concluir los siguientes apartados:

• La utilización de un módem externo facilita grandemente la comunicación consistemas remotos por ser sistemas pseudo inteligentes, los cuales actúan según launa cadena de caracteres determinada (comando AT o Hayes) enviados por elpuerto serie.

• El módem se sitúa en modo comandos o en modo on-line según la detección de lacadena de caracteres que se le transmita. En caso de percibir el conjunto AT, pasaa modo comando automáticamente. En caso de percibir el conjunto ATO, pasa amodo On-line.

• El módem necesita detectar la señal procedente de la línea telefónica (de unos 50voltios aproximadamente) para iniciar comunicación con un elemento externo.Una vez descuelga la línea, esa tensión se reduce hasta los 12 voltios. En caso deno detectar la comentada señal, aborta el proceso de comunicación.

• En el proceso de establecimiento de comunicación, el módem precisa de untiempo necesario para negociar con el otro módem la velocidad a la que seestablecerá la transmisión de datos entre los mismos. Eso provoca la necesidad dedisponer de una temporización suficiente justo después de haber efectuado lacomunicación.

• Para conseguir el objetivo de transmitir y recibir ficheros, el programa seestructura de forma jerarquizada, es decir, se puede distinguir tres niveles:

o Nivel inferior: Transmisión / Recepción de un byte.o Nivel intermedio: Trasmisión / Recepción de un bloque X-MODEM.o Nivel superior: Transmisión / Recepción de un fichero.

• Dentro del nivel inferior, el sistema controla el flujo de datos mediante las señalesRTS y CTS. La primera (Request To Send), sirve para solicitar la utilización delmódem; la segunda (Clear To Send), se utiliza para indicar que el módem estádisponible.

• El control de datos se efectúa mediante interrupciones. En el proceso deconfiguración del sistema, se instala la opción de generar interrupciones debidas atres causas:

o Cambio del estado del módem. Mediante esta causa de interrupción, seconsigue conocer el estado de la conexión con el sistema remoto.

o Búfer de recepción de datos lleno. Mediante esta causa de interrupción, seconoce si se ha recibido un dato.

o Búfer de transmisión de datos vacío. Mediante esta causa de interrupción,se sabe cuando un dato ha sido transmitido hacia el sistema remoto.

La carga o la lectura de los registros de datos se efectúa conociendo el estado dedos variables globales. Justo antes de efectuar una carga para la transmisión de undato, se observa que el estado de una de esas variables indique que el búfer estávacío. De forma similar, para la lectura de un dato, existe otra variable queasegura que el búfer de recepción de datos está cargado.