CarApp
Notificaciones a celulares al detectar la alarma del auto activada.
 Todo Estructuras de Datos Archivos Funciones Variables Enumeraciones Valores de enumeraciones 'defines'
uart.c
Ir a la documentación de este archivo.
1 //******************************************************************************
2 // Nombre: uart.c
3 // Versión: 1.0
4 // Descripción: Módulo encargado de transmitir y recibir los datos. Es la capa
5 // física del sistema que permite la interacción entre el módulo gsm
6 // y el microcontrolador.
7 // Incluye funciones para poder elegir el caracter deseado, y la cantidad
8 // de veces que tiene que aparecer, para considerar el mensaje como completo.
9 // Además, tiene funciones que se encargan de toda la inicialización,
10 // así también como del envío de datos.
11 // Autores: Juan Martín Ortega, Ramiro Barrón, Andrea Cukerman
12 // IIE, Facultad de Ingeniería, UdelaR
13 // Uruguay
14 // Fecha: Junio 2012
15 //******************************************************************************
16 
29 #include <stdio.h>
30 #include <string.h>
31 #include <stdio.h>
32 #include "uart.h"
33 
34 #define P3TXD0 4
35 #define P3RXD0 5
42 static char eofl;
43 
48 static int number_eofl;
49 
54 static int eofl_RX;
55 
60 static buffer TXbuffer;
61 
66 static int flagRX;
67 
72 static int flagTX;
73 
74 
80 
85 void initUART()
86  {
87  P3OUT |= (1 << P3TXD0); // Se configura puerto de UART
88  P3DIR |= (1 << P3TXD0);
89  P3SEL |= (1 << P3TXD0 | 1 << P3RXD0);
90 
91  UCA0CTL1 = UCSSEL_2; // Se selecciona SMCLK como reloj de USCI A0
92  UCA0BR0 = 104;
93  UCA0BR1 = 0; // 1MHz 9600
94  UCA0MCTL = UCBRS0; // Modulation UCBRSx = 1
95  UCA0CTL1 &= ~UCSWRST; // Se inicializa máquina de estados de USCI
96  IE2 |= UCA0RXIE; // Se habilitan interrupciones de RX
97  }// end initUART()
98 
104 void init_UART()
105  {
106  flagTX = 0; // Resetea bandera de transmisión
107  flagRX = 0; // Resetea bandera de recepción
108  TXbuffer.indice = 1; // Setea índice de transmisión en 1
109  RXbuffer.indice = 0; // Setea índice de recepción en 1
110  initUART(); // Inicializa la UART
111  }//end init_UART()
112 
118 void set_eofl(char end_of_line)
119  {
120  eofl = end_of_line; // Configura el caracter de fin de trama.
121  }// end set_eofl(char end_of_line)
122 
128 void set_number_eofl(int number_end_of_line)
129  {
130  number_eofl = number_end_of_line; // Configura la cantidad de fin de trama a esperar.
131  }// end set_number_eofl(int number_end_of_line)
132 
136 #pragma vector = USCIAB0RX_VECTOR
137 __interrupt void ISR_Rx()
138  {
139  if(UCA0RXBUF == eofl) eofl_RX++; // Verifica si el caracter recibido es el definido como fin de trama. Si lo es, incrementa el contador de finales de trama
140  RXbuffer.datos[RXbuffer.indice] = UCA0RXBUF; // Copia al buffer de recepción el caracter recibido
141  RXbuffer.indice++; // Incrementa el índice del buffer de recepción
142  if((RXbuffer.indice==8) && !strncmp(RXbuffer.datos, "\r\nRING\r\n", 8)) // Se comprueba que lo recibido no sea a raiz de una llamada de voz.
143  { // Si lo fue, se descarta el mensaje,
144  RXbuffer.indice = 0; // se resetea el índice, y
145  eofl_RX = 0; // el contador de finales de trama.
146  }
147  if(number_eofl == eofl_RX) // Verifica si la cantidad de finales de trama recibidas es la esperada
148  { // SI LO ES
149  flagRX = 1; // Se levanta la bandera de recepción indicando que hay un mensaje,
150  eofl_RX = 0; // Se resetea el contador de finales de trama
151  RXbuffer.datos[RXbuffer.indice] = (char)0x00; // Se agrega el caracter NULL
152  RXbuffer.indice = 0; // Se resetea el índice del buffer de recepción
153  }
154  }//end ISR de RX
155 
159 #pragma vector = USCIAB0TX_VECTOR
160 __interrupt void ISR_Tx()
161  {
162  if (TXbuffer.datos[TXbuffer.indice] == 0x00) // Verfica si el caracter a transmitir es el caracter NULL
163  { // SI ES EL CARACTER NULL
164  TXbuffer.indice = 1; // Setea el índice de transmisión en uno
165  IE2 &= ~UCA0TXIE; // Deshabilita interrupciones de transmisión
166  flagTX = 1; // Prende la bandera de transmisión
167  }
168  else
169  { // SI NO ES EL CARACTER NULL
170  UCA0TXBUF = TXbuffer.datos[TXbuffer.indice]; // Carga en el registro de transmisión el caracter a transmitir
171  TXbuffer.indice++; // Incrementa el índice de transmisión
172  }
173  }//end ISR de TX
174 
181 void cargarTXbuffer(char *string1)
182  {
183  strcpy(TXbuffer.datos, string1); // Carga el buffer de transmisión con la cadena a enviar
184  UCA0TXBUF = TXbuffer.datos[0]; // Envía el primer caracter
185  IE2 |= UCA0TXIE; // Habilita interrupciones de transmisión
186  }//end cargarTXbuffer()
187 
194  {
195  return flagRX; // Devuelve bandera de recepción
196  }//end get_flagRX()
197 
204  {
205  flagRX = 0; // Resetea la bandera de recepción
206  }// end reset_flagRX()