Comunicación serial segundo corte.

Dependencies:   mbed

SISTEMAS EMBEBIDOS

COMUNICACIÓN SERIAL

EDISON AHUMADA

NELSON YESID POSADA

ALVARO CORTES

CRISTIAN MONTERO

ECCI UNIVERSIDAD ECCI

INTRODUCCIÓN

En el siguiente documento se explica cómo función la comunicación serial, por medio de la aplicación CoolTerm (Terminal de puertos serial multiforma), el cual nos permite tener una conexión por puerto serial con la tarjeta Nucleo 446, donde guardaremos nuestro código ya modificado en la plataforma ARM MBED y que a su vez tendrá conexión con el Piccolo. Gracias a esta aplicación enviaremos datos en hexadecimal al puerto serial y a sus ves al núcleo, donde se convertirán estos caracteres en bytes, enviando datos digitales a los tres servos, generando movimiento en el Piccolo, en cualquier función deseada como por ejemplo realizar un circulo, un cuadrado, una recta etc.

MARCO TEORICO.

COMUNICAION SERIAL: La comunicación serial es un protocolo muy común (no hay que confundirlo con el Bus Serial de Comunicación, o USB) para comunicación entre dispositivos que se incluye de manera estándar en prácticamente cualquier computadora. La mayoría de las computadoras incluyen dos puertos seriales RS-232. La comunicación serial es también un protocolo común utilizado por varios dispositivos para instrumentación; existen varios dispositivos compatibles con GPIB que incluyen un puerto RS-232. Además, la comunicación serial puede ser utilizada para adquisición de datos si se usa en conjunto con un dispositivo remoto de muestreo.

/media/uploads/Edisonap/comunicacion_serial.png

Típicamente, la comunicación serial se utiliza para transmitir datos en formato ASCII. Para realizar la comunicación se utilizan 3 líneas de transmisión: (1) Tierra (o referencia), (2) Transmitir, (3) Recibir. Debido a que la transmisión es asincrónica, es posible enviar datos por una línea mientras se reciben datos por otra. Existen otras líneas disponibles para realizar handshaking, o intercambio de pulsos de sincronización, pero no son requeridas. Las características más importantes de la comunicación serial son la velocidad de transmisión, los bits de datos, los bits de parada, y la paridad. Para que dos puertos se puedan comunicar, es necesario que las características sean iguales.

Comunicación serial asíncrona: En esta comunicación uno de los hilos será para la transmisión de los datos de un dispositivo a otro y el otro hilo será para la recepción de datos entre un dispositivo a otro, la transmisión y la recepción pueden ocurrir en forma simultánea, lo que si se tiene que cumplir es que la frecuencia de trabajo de ambos dispositivos tiene que ser la misma. Comunicación serial asíncrona: En esta comunicación uno de los hilos será utilizado tanto para la transmisión y la recepción de datos por lo que la transmisión no puede ocurrir en forma simultánea, el otro hilo será utilizado para enviar la señal de reloj de sincronización entre ambos dispositivos, en este caso uno de los dispositivos es llamado maestro y el otro esclavo, el maestro es el que controla la señal de reloj y cuando se inicia o finaliza la comunicación. Velocidad de transmisión (baud rate): Indica el número de bits por segundo que se transfieren, y se mide en baudios (bauds). Por ejemplo, 300 baudios representan 300 bits por segundo. Cuando se hace referencia a los ciclos de reloj se está hablando de la velocidad de transmisión. Por ejemplo, si el protocolo hace una llamada a 4800 ciclos de reloj, entonces el reloj está corriendo a 4800 Hz, lo que significa que el puerto serial está muestreando las líneas de transmisión a 4800 Hz. Bits de datos: Se refiere a la cantidad de bits en la transmisión por ejemplo una computadora envía un paquete de información, el tamaño de ese paquete no necesariamente será de 8 bits. Las cantidades más comunes de bits por paquete son 5, 7 y 8 bits. El número de bits que se envía depende en el tipo de información que se transfiere. Por ejemplo, el ASCII estándar tiene un rango de 0 a 127, es decir, utiliza 7 bits; para ASCII extendido es de 0 a 255, lo que utiliza 8 bits. Un paquete se refiere a una transferencia de byte, incluyendo los bits de inicio/parada, bits de datos, y paridad. Debido a que el número actual de bits depende en el protocolo que se seleccione, el término paquete se usar para referirse a todos los casos.

Bits de parada: Es usado para indicar el fin de la comunicación de un solo paquete. Los valores típicos son 1, 1.5 o 2 bits. Debido a la manera como se transfiere la información a través de las líneas de comunicación y que cada dispositivo tiene su propio reloj, es posible que los dos dispositivos no estén sincronizados. Por lo tanto, los bits de parada no sólo indican el fin de la transmisión sino además dan un margen de tolerancia para esa diferencia de los relojes. Mientras más bits de parada se usen, mayor será la tolerancia a la sincronía de los relojes, sin embargo la transmisión será más lenta. Paridad: Es una forma sencilla de verificar si hay errores en la transmisión serial. Existen cuatro tipos de paridad: par, impar, marcada y espaciada. Por ejemplo, si la información a transmitir es 011 y la paridad es par, el bit de paridad sería 0 para mantener el número de bits en estado alto lógico como par. Si la paridad seleccionada fuera impar, entonces el bit de paridad sería 1, para tener 3 bits en estado alto lógico. La paridad marcada y espaciada en realidad no verifican el estado de los bits de datos; simplemente fija el bit de paridad en estado lógico alto para la marcada, y en estado lógico bajo para la espaciada. Esto permite al dispositivo receptor conocer de antemano el estado de un bit, lo que serviría para determinar si hay ruido que esté afectando de manera negativa la transmisión de los datos, o si los relojes de los dispositivos no están sincronizados.

Monitor serial: Es una herramienta muy importante para todos los desarrolladores de software y hardware que trabajan con puertos serie. Esta interfaz permite capturar, mostrar, analizar, grabar y reproducir todos los datos de puerto serie intercambiados entre la aplicación de Windows y el dispositivo serie. Nos representa una gran ayuda en cuando a la facilidad de enviar datos y orientar las diferentes variables que se ejecutan en función de las necesidades, podemos realizar pruebas fácilmente de nuestro programa sin intervenir el código directamente y volver a compilar.

DESCRIPCIÓN DEL CODIGO

1. int coord2pulse(float coord) 2. { 3. if(0 <= coord <= MAXPOS) 4. return int(coord*1000/150+750); 5. return 750; 6. }

Se introduce un valor menor a 255 en binario que es la máxima posición que puede tener los servos dentro de su rango de trabajo es decir 180°.

7. uint8_t buffer_command[BUFF_SIZE]={0,0,0,0}; Se establece un carácter que va guardar el inicio, fin del comando, los parámetros del comando y el comando o función que va realizar el piccolo.

8. void print_num(uint8_t val) 9. { 10. if (val <10) 11. command.putc(val+0x30); 12. else 13. command.putc(val-9+0x40); 14. } 15. void print_bin2hex (uint8_t val) 16. { 17. command.printf(" 0x"); 18. print_num(val>>4); 19. print_num(val&0x0f); 20. }

Se realiza una operación para convertir el carácter decimal porque nuestro monitor serial solo puede leer carácter en forma hexadecimal y ASQUI.

21. void Read_command() 22. { 23. for (uint8_t i=0; i<BUFF_SIZE;i++) 24. buffer_command[i]=command.getc(); 25. }

Atreves de un for recorre todas las posiciones, que se dejaron en el tamaño del buffer, obteniendo el comando que se desea realizar.

26. void echo_command() 27. { 28. for (uint8_t i=0; i<BUFF_SIZE;i++) 29. print_bin2hex(buffer_command[i]); 30. } La función de este void es recorrer las posiciones para identificar los parámetro asignados en (buffer_command[INITPARAMETER]); 31. uint8_t check_command() 32. { 33. if (buffer_command[BUFF_SIZE-1]== '>'){ 34. #if DEBUG 35. command.printf("\nComando:"); 36. print_bin2hex(buffer_command[COMM_N]); 37. command.printf(" -> "); 38. #endif 39. return 1; 40. } 41. #if DEBUG 42. command.printf("\n ERROR COMANDO -> "); 43. echo_command(); 44. #endif 45. return 0; 46. }

Esta función retorna de 0 a 1, imprimiendo el comando que se ingresa en hexadecimal, por medio de comunicación serial en nuestro caso es enviado por coolterm. Este if imprime el comando que decidimos ejecutar, con sus respectivos parámetros, en caso de que el código en hexadecimal se encuentre errado, dicho if arrojara un mensaje de error de comando.

47. void command_led(int tm) 48. { 49. led=1; 50. wait(tm); 51. led=0; 52. }

Este es un ejemplo de comando, en este caso es el led donde se declara la variable tm (tiempo) y a continuación indica la función de encendido del led, tiempo en el cual estará prendido el led. Este tiempo es definido por el usuario cuando se digita en el tercer parámetro en hexadecimal por el programa coolterm, después de haber trascurrido este tiempo el led se apaga.

53. int main() { 54. #if DEBUG 55. command.printf("inicio con debug\n"); 56. #else 57. command.printf("inicio sin debug\n"); 58. #endif

En el main se busca primero la comunicación serial con el coolterm al enviar como dato un 1 o un byte completo, ya que se envía por comunicación serial la tarjeta núcleo “responde “ si está en “Inicio con debug” o “inicio sin debug”

59. uint8_t val; 60. while(1){ 61. val=command.getc(); 62. if (val== '<'){Haya iniciado una trasmision de comando 63. Read_command(); 64. if (check_command()){ a. command_led(buffer_command[INITPARAMETER]); b. #if DEBUG c. echo_command(); d. #endif 65. } 66. } 67. else command.printf("error inicio trama: "); 68. command.putc(val); 69. }

En esta última parte del main declaramos un carácter entero llamada val, y realizamos la siguiente operación. Mientras el debug este en 1 esperamos un comando con la función getc, SI el valor ya inicio el comando de trasmisión por medio del carácter “<” ir a la función leer comando, después ejecuta otro IF con la función check_command, para verificar cada uno de los comandos establecidos y revisar en qué valor se encuentra la primera posición del BUFF_SIZE, al saber que parámetro es, comienza a ejecutarlo por medio de la función echo_command. En caso de no reconocer el comando ingresado, arrojara un mensaje “error inicio de trama”.

DISEÑO :

/media/uploads/Edisonap/20171020_191626.jpg /media/uploads/Edisonap/20171020_191614.jpg /media/uploads/Edisonap/20171020_191550.jpg

GLOSARIO

Buffer: Es un espacio de memoria, en el que se almacenan datos de manera temporal, normalmente para un único uso. Su principal uso es para evitar que el programa o recurso que los requiere, ya sea hardware o software, se quede sin datos durante una transferencia (entrada/salida) de datos irregular o por la velocidad del proceso.

  1. Define: Es una constante o valor que no puede ser alterado/modificado durante la ejecución de un programa, únicamente puede ser leído. Una constante corresponde a una longitud fija de un área reservada en la memoria principal del ordenador, donde el programa almacena valores fijos.

uint8_t: Número entero sin signo de 1 byte, es un alias para un tipo de dato usigned char que ocupa 1 byte de memoria codificando números de 0 a 255.

INITPARAMETER: Posición número de comando, esta constante se declara, para saber dónde inicia los parámetros, de ejecución. Void: Función que retorna un valor en 0, devolviendo un valor en nada “vacío”.

CONCLUSIONES

• Gracias a la comunicación serial podemos tener un intercambio de información con la tarjeta núcleo la cual está conectada con el Picccolo, generando una comunicación en línea, que nos facilita los cambios de funciones que va realizar nuestro Piccolo.

• Concluimos que, gracias a definir los comandos, como constantes podemos buscar cualquiera de ellos con un valor ya establecido, facilitando las funciones que va realizar el Piccolo, ya que con el simple hecho de digitar el comando en la posición 2, este realizara la función deseada.

Download repository: zip gz

Files at revision 0:d3a0eceae856

Name Size Actions
[up]
main.cpp 6545 Revisions Annotate
mbed.bld 66 Revisions Annotate