Práctica 3ProgramacionRS232: Programación básica de la RS232 1 Objetivos El objetivo de esta práctica es la iniciación del alumno en la programación de las comunicaciones en un entorno de desarrollo basado en C. El entorno es equivalente para otros lenguajes como visualbasic, .net, java, etc. Al final de la práctica el alumno debería ser capaz de: • Utilizar un API sencilla para comunicaciones. • Realizar programas sencillos en C para manejar la RS232. • Entender y dar soluciones al carácter asíncrono de las comunicaciones en la recepción de datos. 2 Tiempo de laboratorio 1 sesión. 3 Entorno de programación para las comunicaciones serie En este apartado el alumno aprenderá a manejar el entorno de programación para programar la vía serie utilizando C y una API basada en Win32. El primer paso consiste en interconectar el puerto serie 1 (COM1) del ordenador con el puerto 4 (COM4) mediante el cable de RS232 utilizado en la primera práctica (Herramientas básicas para usar la RS232). A continuación comprobar con Windmill la comunicación entre COM1 y COM4. Una vez comprobado el correcto funcionamiento, cerrar las sesiones de Windmill abiertas para liberar los puertos serie y poder realizar el siguiente paso. El segundo paso consiste en arrancar el entorno de programación MinGW y descargar el código colgado de la página web, para comprobar y programar la RS232. Para ello se deben seguir los siguientes pasos: 1. Cree un directorio de nombre ‘PruRS232’. 2. Copie al directorio anterior, desde la página web del laboratorio de la asignatura de Fundamentos de Comunicaciones Industriales (http://www.dea.icai.upcomillas.es/jarm), el fichero ‘APIRS232.zip’. Descomprímalo a continuación y aparecerán los siguientes ficheros: • serie.cpp y serie.h: son la interfaz para poder programar la RS232 cómodamente. Define cuatro funciones: o OpenSerialPort permite establecer la comunicación con un puerto serie como si fuera un fichero. Los argumentos son: el puerto serie, la velocidad, el tamaño del byte, el tipo de paridad, el número de bits de stop y el timeout para las lecturas. Devuelve el identificador de la conexión abierta (Handle). Cada vez que se quiera operar con ese puerto serie habrá que utilizar dicho identificador. o SerialSendByte envía un byte por el puerto serie indicado por el identificador (Handle). Si la operación es correcta devolverá TRUE. o SerialReceiveByte recibe un byte por el puerto serie indicado por el identificador (Handle). Si la operación es correcta devolverá TRUE con Timeout=FALSE. Si se ha sobrepasado el tiempo de timeout especificado en la apertura del puerto, devolverá TRUE con Timeout a TRUE. Si hay problemas en la lectura devuelve FALSE. Práctica 3. 1 o CloseSerialPort cierra la comunicación con el puerto serie indicado por el identificador (Handle). A toda operación correcta de apertura de puerto le debe corresponder una operación de cierre (como en los ficheros). 3. Arranque MinGW: Botón de Inicio -> Programas -> Lenguajes de Programación -> Mingo Developer Studio -> Mingo Developer Studio. En el directorio también se encuentra el fichero de ayuda de la API de windows (Windows API Reference). Aparecerá la siguiente pantalla: MinGW es un entorno de programación en C que utiliza las herramientas de GNU. 4. Cree un proyecto tipo terminal de nombre enviar y directorio ‘PruRS232’: • Seleccione Project -> New Project. • Seleccione Win32 Console Application; Project name: enviar y Location: ..\PruRS232. A continuación pulse OK. • Práctica 3. Compruebe que aparece el fichero enviar.msp en el directorio de trabajo. Es el fichero donde se guarda la configuración del proyecto en C. 2 5. Adjunte los ficheros enviar.cpp y serie.cpp como código fuente y serie.h como cabecera (include). Para ello despliegue el proyecto en FileView (parte central izquierda). Aparecen cuatro categorías de ficheros: source, header, resource y other. Posicione el ratón sobre Source Files y pulse el botón derecho para añadir ficheros. En la ventana que emerge seleccione enviar.cpp y serie.cpp. Repita la operación sobre Header Files para añadir serie.h al proyecto. Inspeccione los ficheros enviar.cpp, serie.cpp y serie.h. Para ello, una vez que forman parte del proyecto, haga doble clic directamente sobre ellos. El fichero enviar.cpp es un fichero de prueba para comprobar el funcionamiento de la API de comunicaciones descrita anteriormente. Realiza las siguientes operaciones: • Abre el puerto de comunicaciones con configuración COM1, 9600, 8, N, 2. • Lee continuamente del teclado carácter a carácter y lo envía por el puerto. • Cierra el puerto cuando se pulsa ‘x’. En la misma carpeta donde se encuentra MinGW existe un enlace a la ayuda de la API de win32 (Windows API Reference), es decir, la API de Windows. Un API es una biblioteca de funciones que permiten manejar recursos proporcionados por terceros (en nuestro caso todas las posibilidades del sistema operativo Windows) de una manera cómoda y transparente. 6. Compile y cree el ejecutable enviar.exe. Para ello ejecute Build -> Build. Observe que se ha creado un directorio en el directorio ‘PruRS232’ de nombre ‘Debug’ que contiene enviar.exe. Con este programa podrá enviar las teclas pulsadas a través del COM1 con la siguiente configuración: 9600, 8, N, 2 (velocidad, nº bits, paridad, nº de bits de stop). 7. Cierre el proyecto mediante Project -> Close Project. Si se quisiera abrir, utilice Project -> Open Project y elija el fichero enviar.msp. 8. Abra un nuevo proyecto en el mismo directorio, siguiendo los pasos del 1 a 6, y de nombre ‘recibir’ (se creará recibir.msp). Adjunte como ficheros fuente recibir.cpp y serie.cpp y como cabecera serie.h. Compile y cree el ejecutable recibir.exe que aparecerá en el subdirectorio ‘Debug’. Este programa le permite recibir caracteres a través del COM4 con la configuración 9600, 8, N, 2. Práctica 3. 3 Conforme llegan se envían a pantalla. Si pasa un cierto tiempo sin recibir datos, el programa envía un mensaje de timeout a la pantalla. 9. Ejecute ambos programas (directorio ‘Debug’). Escriba en la ventana de enviar.exe (pulsar return al final). Lo enviado se recibe en recibir.exe. Si no funcionase, como el cable ha sido comprobado con Windmill, el problema está en enviar.exe o en recibir.exe o en ambos. 10. Finalice la ejecución de ambos programas. 11. Compruebe que los programas enviar y recibir operan perfectamente con Windmill. Para ello: • Arranque enviar y Windmill, con configuración COM4, 9600, 8, N, 2. Compruebe que lo enviado desde enviar se recibe en Windmill. • Arranque recibir y Windmill, con configuración COM1, 9600, 8, N, 2. Compruebe que lo enviado desde Windmill se recibe en recibir.exe. Compruebe también qué ocurre cuando se mandan caracteres de control ASCII como 0x07 (ver primera práctica). Resultados a entregar al final de la sesión: Explicación del funcionamiento de la API utilizada. Máximo un folio por las 2 caras. 4 Configuración de las comunicaciones En este apartado el alumno aprenderá a utilizar código ya preparado para mejorar sus prestaciones. Se trata de mejorar el código de los programas de prueba para que se puedan configurar las comunicaciones cuando se ejecuta el programa, sin necesidad de compilar. Siguiendo los pasos del apartado anterior, cree un nuevo directorio llamado ‘PruRS232Conf’. Copie a dicho directorio los archivos serie.cpp, serie.h, enviar.cpp (como enviarconf.cpp), y recibir.cpp (como recibirconf.cpp). Arranque la herramienta MinGW y cree el proyecto enviarconf con los archivos enviarconf.cpp, serie.cpp y serie.h. Modifique enviarconf para que pida en el arranque: el puerto de comunicaciones, la velocidad de la comunicación, el número de bits por byte, la paridad y el número de bits de stop. A continuación se da un pequeño ejemplo para la lectura de parámetros en el caso de sólo pedir la velocidad: DWORD dwBaudRate; int lVelocidad; printf("Velocidad (9600,19200,...): "); scanf("%d", &lVelocidad); switch (lVelocidad){ case 9600: dwBaudRate = CBR_9600; break; case 19200: dwBaudRate = CBR_19200; break; default: dwBaudRate = CBR_9600; break; } hPort = OpenSerialPort("COM1", dwBaudRate, 8, NOPARITY, TWOSTOPBITS, 5000); Práctica 3. 4 Compruebe que el programa funciona correctamente empleando Windmill como receptor. Repita el mismo proceso para recibirconf y compruebe, junto con enviarconf, que se puede trabajar con diferentes parámetros en las comunicaciones sin necesidad de recompilar los programas. El profesor deberá comprobar en el laboratorio el funcionamiento correcto de este apartado. 5 Chat: Receptor y transmisor en el mismo programa En este apartado el alumno profundizará en los problemas que plantean las comunicaciones cuando se quiere recibir y transmitir simultáneamente. Programe una consola que permita transmitir y recibir simultáneamente, en vez de lo programado hasta ahora: una ventana y un puerto para recibir y otra ventana y otro puerto para enviar. Este programa debe permitir la conversación bidireccional entre 2 puertos serie que pueden estar en el mismo o en diferentes ordenadores. Es un ejemplo de un HyperTerminal muy simple o de un simple “chat”. El programa será la suma de la funcionalidad de enviar y recibir. Un ejemplo de pseudocódigo para dicho programa es el siguiente: Pedir Parámetros de configuración del puerto Abrir Puerto según parámetros de configuración While(1){ ¿Se ha tecleado algo? { Se envía lo tecleado al puerto y a la pantalla } ¿Se ha recibido algo? { Se envía lo recibido a la pantalla } } Para confeccionar el programa puede resultar útil la función kbhit de la biblioteca conio.h y la función getch (más información en www.msdn.com). El profesor deberá comprobar en el laboratorio el funcionamiento correcto de este apartado. Tenga en cuenta el alumno que este programa se utilizará en las prácticas sucesivas. Práctica 3. 5 Práctica 3. 6 Plantilla para resultados 3ProgramacionRS232 Alumno_____________________________________________________ Apartado 3 Explicar el funcionamiento de la API utilizada. ______________________________________________________________________ ______________________________________________________________________ ______________________________________________________________________ ______________________________________________________________________ ______________________________________________________________________ ______________________________________________________________________ ______________________________________________________________________ ______________________________________________________________________ ______________________________________________________________________ ______________________________________________________________________ ______________________________________________________________________ ______________________________________________________________________ ______________________________________________________________________ ______________________________________________________________________ ______________________________________________________________________ ______________________________________________________________________ ______________________________________________________________________ ______________________________________________________________________ ______________________________________________________________________ ______________________________________________________________________ ______________________________________________________________________ ______________________________________________________________________ ______________________________________________________________________ ______________________________________________________________________ ______________________________________________________________________ ______________________________________________________________________ ______________________________________________________________________ ______________________________________________________________________ ______________________________________________________________________ ______________________________________________________________________ ______________________________________________________________________ ______________________________________________________________________ ______________________________________________________________________ Práctica 3. 7 ______________________________________________________________________ ______________________________________________________________________ ______________________________________________________________________ ______________________________________________________________________ ______________________________________________________________________ ______________________________________________________________________ ______________________________________________________________________ ______________________________________________________________________ ______________________________________________________________________ ______________________________________________________________________ ______________________________________________________________________ ______________________________________________________________________ ______________________________________________________________________ ______________________________________________________________________ ______________________________________________________________________ ______________________________________________________________________ ______________________________________________________________________ ______________________________________________________________________ ______________________________________________________________________ ______________________________________________________________________ ______________________________________________________________________ ______________________________________________________________________ ______________________________________________________________________ ______________________________________________________________________ ______________________________________________________________________ ______________________________________________________________________ ______________________________________________________________________ ______________________________________________________________________ ______________________________________________________________________ Apartado 4 Entregar copia del código al profesor. Apartado 5 Entregar copia del código al profesor. Práctica 3. 8