comentarios sobre el código del gsm_tarea celular

Dependencies:   DebouncedIn mbed

Committer:
szapataa
Date:
Tue Nov 24 06:20:54 2015 +0000
Revision:
0:fbcbe8ca7fae
codigo del celular junto a los comentarios

Who changed what in which revision?

UserRevisionLine numberNew contents of line
szapataa 0:fbcbe8ca7fae 1 /*------------------------------------------------------------------------------------------------------------------------------------*/
szapataa 0:fbcbe8ca7fae 2 // Programa para enviar desde la FRDMKL25Z un mensaje de texto en formatp PDU
szapataa 0:fbcbe8ca7fae 3 // Como modem usa un celular SIEMENS a56i
szapataa 0:fbcbe8ca7fae 4 // ENVIAR -----la palabra "ALARMA 1"
szapataa 0:fbcbe8ca7fae 5 //
szapataa 0:fbcbe8ca7fae 6
szapataa 0:fbcbe8ca7fae 7 // OJO CON ESTO
szapataa 0:fbcbe8ca7fae 8 // conector del siemens cable verde es RX conectelo a PTE0 cable blanco es TX conectelo a PTE1
szapataa 0:fbcbe8ca7fae 9 #include "mbed.h"
szapataa 0:fbcbe8ca7fae 10 #include "DebouncedIn.h"
szapataa 0:fbcbe8ca7fae 11 #include "stdio.h"
szapataa 0:fbcbe8ca7fae 12 #include "string.h"
szapataa 0:fbcbe8ca7fae 13 Timer t;
szapataa 0:fbcbe8ca7fae 14 DigitalOut LedVerde(LED2); /*declara el puerto donde conecta el LED2*/
szapataa 0:fbcbe8ca7fae 15 DigitalOut LedRojo(LED1); /*declara el puerto donde se conecta el LED1*/
szapataa 0:fbcbe8ca7fae 16 DigitalOut LedAzul(LED3); /*declara el puerto donde se conecta el LED3*/
szapataa 0:fbcbe8ca7fae 17 DebouncedIn button1(PTC12); //señal que inicia el envio del mensaje
szapataa 0:fbcbe8ca7fae 18 Serial GSM(PTE0,PTE1); //Configura puerto UART de la FRDMKL25Z
szapataa 0:fbcbe8ca7fae 19 Serial pc(USBTX,USBRX);//Configura puerto USB a la consola serial del PC conectado.
szapataa 0:fbcbe8ca7fae 20 void Rx_interrupt();
szapataa 0:fbcbe8ca7fae 21 int position=0; /*inicializa variable position*/
szapataa 0:fbcbe8ca7fae 22 int intentos=0; /*inicializa variable intentos*/
szapataa 0:fbcbe8ca7fae 23 int lenpack=6; /*inicializa variable lenpack*/
szapataa 0:fbcbe8ca7fae 24 int ret=1; /*inicializa variable ret*/
szapataa 0:fbcbe8ca7fae 25 int longi=0; /*inicializa variable longi*/
szapataa 0:fbcbe8ca7fae 26 char tel[11]; /*inicializa variable tel*/
szapataa 0:fbcbe8ca7fae 27 char DE[50]; /*inicializa variable DE*/
szapataa 0:fbcbe8ca7fae 28 char buffer[100]; /*inicializa variable buffer*/
szapataa 0:fbcbe8ca7fae 29 char buffermsg[100]; /*inicializa variable buffermsg*/
szapataa 0:fbcbe8ca7fae 30 char buffer1[100]; /*inicializa variable buffer*/
szapataa 0:fbcbe8ca7fae 31 char datos[100]; /*inicializa variable datos*/
szapataa 0:fbcbe8ca7fae 32 char NUMBER[13]; /*inicializa variable NUMBER*/
szapataa 0:fbcbe8ca7fae 33 char resp[6]; /*inicializa variable resp*/
szapataa 0:fbcbe8ca7fae 34 char CMT[]="+CMTI"; /*inicializa variable CMT*/
szapataa 0:fbcbe8ca7fae 35 char tam[2]; /*inicializa variable tam*/
szapataa 0:fbcbe8ca7fae 36 int index; /*inicializa variable index*/
szapataa 0:fbcbe8ca7fae 37 int count; /*inicializa variable count*/
szapataa 0:fbcbe8ca7fae 38 int i = 0; /*inicializa variable i en cero*/
szapataa 0:fbcbe8ca7fae 39 int j = 0; /*inicializa variable j en cero*/
szapataa 0:fbcbe8ca7fae 40 int c=0; /*inicializa variable c en cero*/
szapataa 0:fbcbe8ca7fae 41 unsigned char CtrlZ = 0x1A; // comodin de emision controlZ
szapataa 0:fbcbe8ca7fae 42 bool Flag = false; // bandera
szapataa 0:fbcbe8ca7fae 43 char r[]=""; //Cadena de recepcion de la trama PDU si se usa!!
szapataa 0:fbcbe8ca7fae 44 char msg[256]; /*cadena del mensaje*/
szapataa 0:fbcbe8ca7fae 45 char char1;
szapataa 0:fbcbe8ca7fae 46 //Flush serial para el buffer
szapataa 0:fbcbe8ca7fae 47 void FlushGSM(void) { /*funcion para borrar el buffer*/
szapataa 0:fbcbe8ca7fae 48 char1 = 0; /*inicializa la variable char1*/
szapataa 0:fbcbe8ca7fae 49 while (GSM.readable()){ /*inicia el cilo infinito que busca los mensajes*/
szapataa 0:fbcbe8ca7fae 50 char1 = GSM.getc();} /*la funcion getc lee el GSM*/
szapataa 0:fbcbe8ca7fae 51 return;} /*termina el la limpieza del buffer*/
szapataa 0:fbcbe8ca7fae 52
szapataa 0:fbcbe8ca7fae 53 void callback() { /*devuelve lo que lee el GSM*/
szapataa 0:fbcbe8ca7fae 54 // Note: you need to actually read from the serial to clear the RX interrupt
szapataa 0:fbcbe8ca7fae 55 pc.printf("%c\n", GSM.getc());/*muestra en el pc lo que captura el GSM*/
szapataa 0:fbcbe8ca7fae 56
szapataa 0:fbcbe8ca7fae 57 }
szapataa 0:fbcbe8ca7fae 58 //****************************************************************************************************************
szapataa 0:fbcbe8ca7fae 59 //esta funcion de abajo lee todo un bufer hasta encontrar CR o LF y el resto lo rellena de
szapataa 0:fbcbe8ca7fae 60 //$, count es lo que va a leer.Lo leido lo mete en buffer que es una cadena previamente definida
szapataa 0:fbcbe8ca7fae 61 //incorpora medida de tiempo si se demora mas de tres segundos retorna fracaso con -1
szapataa 0:fbcbe8ca7fae 62 //****************************************************************************************************************
szapataa 0:fbcbe8ca7fae 63 int readBuffer(char *buffer,int count) /*lee el buffer*/
szapataa 0:fbcbe8ca7fae 64 {
szapataa 0:fbcbe8ca7fae 65 int i=0;
szapataa 0:fbcbe8ca7fae 66 t.start(); // start timer
szapataa 0:fbcbe8ca7fae 67 while(1) { /*inicia el ciclo infinito para leer el buffer*/
szapataa 0:fbcbe8ca7fae 68 while (GSM.readable()) { /*captura los datos que entran por el puerto GSM*/
szapataa 0:fbcbe8ca7fae 69 char c = GSM.getc(); /*obtiene los datos que entran por el puerto CSM y los guarda en la variable c*/
szapataa 0:fbcbe8ca7fae 70 if (c == '\r' || c == '\n') c = '$'; /*condiciona la variable c*/
szapataa 0:fbcbe8ca7fae 71 buffer[i++] = c; /*almacena en el buffer*/
szapataa 0:fbcbe8ca7fae 72 if(i > count)break; /*si se cumplela condicion sale del bucle*/
szapataa 0:fbcbe8ca7fae 73 }
szapataa 0:fbcbe8ca7fae 74 if(i > count)break; /*si sale del bucle entra en este condicional*/
szapataa 0:fbcbe8ca7fae 75 if(t.read() > 3) { /*condiciona a la variable t a ser menor de 3 segundos*/
szapataa 0:fbcbe8ca7fae 76 t.stop(); /*para la variable t*/
szapataa 0:fbcbe8ca7fae 77 t.reset();/*reinicia la variable t*/
szapataa 0:fbcbe8ca7fae 78 break; /*sale del bucle*/
szapataa 0:fbcbe8ca7fae 79 }
szapataa 0:fbcbe8ca7fae 80 }/*termina el ciclico*/
szapataa 0:fbcbe8ca7fae 81 wait(0.5); /*espera medio segundo*/
szapataa 0:fbcbe8ca7fae 82 while(GSM.readable()) { // display the other thing..
szapataa 0:fbcbe8ca7fae 83 char c = GSM.getc(); /*almacena en la variable c lo que "recoge del puerto GSM"*/
szapataa 0:fbcbe8ca7fae 84 }
szapataa 0:fbcbe8ca7fae 85 return 0; /*termina el while*/
szapataa 0:fbcbe8ca7fae 86 }
szapataa 0:fbcbe8ca7fae 87 //********************************************************************************
szapataa 0:fbcbe8ca7fae 88 /* esta funcion de abajo limpia o borra todo un "buffer" de tamaño "count"
szapataa 0:fbcbe8ca7fae 89 lo revisa elemento por elemento y le mete el caracter null que indica fin de cadena
szapataa 0:fbcbe8ca7fae 90 no retorna nada
szapataa 0:fbcbe8ca7fae 91 */
szapataa 0:fbcbe8ca7fae 92 //***************************************************************************************
szapataa 0:fbcbe8ca7fae 93 void cleanBuffer(char *buffer, int count) /*limpia el buffer*/
szapataa 0:fbcbe8ca7fae 94 {
szapataa 0:fbcbe8ca7fae 95 for(int i=0; i < count; i++) { /*inicia el contador*/
szapataa 0:fbcbe8ca7fae 96 buffer[i] = '\0'; /*coloca el ultimo caracter de la cadena*/
szapataa 0:fbcbe8ca7fae 97 }
szapataa 0:fbcbe8ca7fae 98 }
szapataa 0:fbcbe8ca7fae 99 /* esta funcion de abajo envia un comando parametrizado como cadena
szapataa 0:fbcbe8ca7fae 100 puede ser un comando tipo AT
szapataa 0:fbcbe8ca7fae 101 */
szapataa 0:fbcbe8ca7fae 102 //***************************************************************************************
szapataa 0:fbcbe8ca7fae 103 void sendCmd(char *cmd) /*envia un comando tipo cmd*/
szapataa 0:fbcbe8ca7fae 104 {
szapataa 0:fbcbe8ca7fae 105 GSM.puts(cmd); /*envia comando cmd por el puerto GSM*/
szapataa 0:fbcbe8ca7fae 106 }
szapataa 0:fbcbe8ca7fae 107 //****************************************************************************************
szapataa 0:fbcbe8ca7fae 108 /* esta funcion de abajo espera la respuesta de un comando que debe ser identica a la cadena "resp" y un tiempo timeout"
szapataa 0:fbcbe8ca7fae 109 si todo sale bien retorna un cero que en la programacion hay que validar
szapataa 0:fbcbe8ca7fae 110 si algo sale mal ( no se parece o se demora mucho )retorna -1 que debera validarse con alguna expresion logica
szapataa 0:fbcbe8ca7fae 111 */
szapataa 0:fbcbe8ca7fae 112 //***************************************************************************************
szapataa 0:fbcbe8ca7fae 113 int waitForResp(char *resp, int timeout) /*espera para enviar una respuesta*/
szapataa 0:fbcbe8ca7fae 114 {
szapataa 0:fbcbe8ca7fae 115 int len = strlen(resp); /*guarda la longitud de la cadena resp en la variable len*/
szapataa 0:fbcbe8ca7fae 116 int sum=0; /*inicializa la variable sum*/
szapataa 0:fbcbe8ca7fae 117 t.start(); /*inicia el conteo de tiempo*/
szapataa 0:fbcbe8ca7fae 118
szapataa 0:fbcbe8ca7fae 119 while(1) {/*inicia un nuevo ciclico*/
szapataa 0:fbcbe8ca7fae 120 if(GSM.readable()) { /*activada la lectura del puerto GSM*/
szapataa 0:fbcbe8ca7fae 121 char c = GSM.getc(); /*guarda en la variable c lo que lee en el puerto GSM*/
szapataa 0:fbcbe8ca7fae 122 sum = (c==resp[sum]) ? sum+1 : 0;// esta linea de C# sum se incrementa o se hace cero segun c
szapataa 0:fbcbe8ca7fae 123 if(sum == len)break; //ya acabo se sale
szapataa 0:fbcbe8ca7fae 124 }
szapataa 0:fbcbe8ca7fae 125 if(t.read() > timeout) { // time out chequea el tiempo minimo antes de salir perdiendo
szapataa 0:fbcbe8ca7fae 126 t.stop(); /*para la variable t*/
szapataa 0:fbcbe8ca7fae 127 t.reset();/*reinicia la variable t*/
szapataa 0:fbcbe8ca7fae 128 return -1; /*muestra que fallo el intento*/
szapataa 0:fbcbe8ca7fae 129 }
szapataa 0:fbcbe8ca7fae 130 } /*termina el ciclico de lectura del puerto GSM*/
szapataa 0:fbcbe8ca7fae 131 t.stop(); // stop timer antes de retornar
szapataa 0:fbcbe8ca7fae 132 t.reset(); // clear timer
szapataa 0:fbcbe8ca7fae 133 while(GSM.readable()) { // display the other thing..
szapataa 0:fbcbe8ca7fae 134 char c = GSM.getc(); /*guarda en la variable c lo que lee en el puerto GSM*/
szapataa 0:fbcbe8ca7fae 135 }
szapataa 0:fbcbe8ca7fae 136
szapataa 0:fbcbe8ca7fae 137 return 0; /*todo sale bn*/
szapataa 0:fbcbe8ca7fae 138 }
szapataa 0:fbcbe8ca7fae 139 /* esta funcion de abajo es muy completa e util se encarga de enviar el comando y esperar la respuesta
szapataa 0:fbcbe8ca7fae 140 si todo sale bien retorna un cero(herencia de las funciones contenedoras) que en la programacion hay que validar
szapataa 0:fbcbe8ca7fae 141 con alguna expresion logica
szapataa 0:fbcbe8ca7fae 142 */
szapataa 0:fbcbe8ca7fae 143 //***************************************************************************************
szapataa 0:fbcbe8ca7fae 144 int sendCmdAndWaitForResp(char *cmd, char *resp, int timeout) /*envia un comando de prueba y espera la respuesta de si efectivamente llegó*/
szapataa 0:fbcbe8ca7fae 145 {
szapataa 0:fbcbe8ca7fae 146 sendCmd(cmd); /*envía comando cmd*/
szapataa 0:fbcbe8ca7fae 147 return waitForResp(resp,timeout); /*retorna el tiempo de espera*/
szapataa 0:fbcbe8ca7fae 148 }
szapataa 0:fbcbe8ca7fae 149 /* esta funcion de abajo chequea que el modem este vivo envia AT y le contesta con OK y espera 2 segundos
szapataa 0:fbcbe8ca7fae 150 */
szapataa 0:fbcbe8ca7fae 151 //***************************************************************************************
szapataa 0:fbcbe8ca7fae 152 int powerCheck(void)// este comando se manda para verificar si el modem esta vivo o conectado
szapataa 0:fbcbe8ca7fae 153 {
szapataa 0:fbcbe8ca7fae 154 return sendCmdAndWaitForResp("AT\r\n", "OK", 2);
szapataa 0:fbcbe8ca7fae 155 }
szapataa 0:fbcbe8ca7fae 156 /* esta funcion de abajo chequea el estado de la sim card
szapataa 0:fbcbe8ca7fae 157 y si todo sale bien retorna un cero que en la programacion hay que validar
szapataa 0:fbcbe8ca7fae 158 con alguna expresion logica
szapataa 0:fbcbe8ca7fae 159 */
szapataa 0:fbcbe8ca7fae 160 //***************************************************************************************
szapataa 0:fbcbe8ca7fae 161 int checkSIMStatus(void) /*verifica el estado de la conexión con la SIM*/
szapataa 0:fbcbe8ca7fae 162 {
szapataa 0:fbcbe8ca7fae 163 char gprsBuffer[30]; /*genera una cadena de 30 posiciones*/
szapataa 0:fbcbe8ca7fae 164 int count = 0; /*inicia el contador*/
szapataa 0:fbcbe8ca7fae 165 cleanBuffer(gprsBuffer,30); /*limpia el buffer*/
szapataa 0:fbcbe8ca7fae 166 while(count < 3) { /*condiciona el contador*/
szapataa 0:fbcbe8ca7fae 167 sendCmd("AT+CPIN?\r\n"); /*automaticamente envia el comando AT+CPIN*/
szapataa 0:fbcbe8ca7fae 168 readBuffer(gprsBuffer,30); /*lee el buffer*/
szapataa 0:fbcbe8ca7fae 169 if((NULL != strstr(gprsBuffer,"+CPIN: READY"))) {
szapataa 0:fbcbe8ca7fae 170 break; /*si la longitud de la cadena no es nula sale del bucle*/
szapataa 0:fbcbe8ca7fae 171 }
szapataa 0:fbcbe8ca7fae 172 count++; /*amenta el contador*/
szapataa 0:fbcbe8ca7fae 173 wait(1); /*espera 1 segundo*/
szapataa 0:fbcbe8ca7fae 174 }
szapataa 0:fbcbe8ca7fae 175
szapataa 0:fbcbe8ca7fae 176 if(count == 3) {
szapataa 0:fbcbe8ca7fae 177 return -1; /*si count es igual a 3, el intento falló*/
szapataa 0:fbcbe8ca7fae 178 }
szapataa 0:fbcbe8ca7fae 179 return 0; /*si todo se cumple retorna el 0*/
szapataa 0:fbcbe8ca7fae 180 }
szapataa 0:fbcbe8ca7fae 181 /* esta funcion de abajo chequea la calidad de la señal
szapataa 0:fbcbe8ca7fae 182 y si todo sale bien retorna con el valor de señal util o un -1 si no es aceptable, en la programacion hay que validar
szapataa 0:fbcbe8ca7fae 183 con alguna expresion logica
szapataa 0:fbcbe8ca7fae 184 */
szapataa 0:fbcbe8ca7fae 185 //***************************************************************************************
szapataa 0:fbcbe8ca7fae 186 int checkSignalStrength(void) /*verifica el estado de la señal*/
szapataa 0:fbcbe8ca7fae 187 {
szapataa 0:fbcbe8ca7fae 188 char gprsBuffer[100]; /*genera una cadena de 100 posiciones*/
szapataa 0:fbcbe8ca7fae 189 int index,count = 0; /*inicializa el contador y el index*/
szapataa 0:fbcbe8ca7fae 190 cleanBuffer(gprsBuffer,100); /*limpia el buffer*/
szapataa 0:fbcbe8ca7fae 191 while(count < 3) {
szapataa 0:fbcbe8ca7fae 192 sendCmd("AT+CSQ\r\n"); /*si el contador es menor a 3 envía el comando AT+CSQ*/
szapataa 0:fbcbe8ca7fae 193 readBuffer(gprsBuffer,25); /*lee el buffer*/
szapataa 0:fbcbe8ca7fae 194 if(sscanf(gprsBuffer, "AT+CSQ$$$$+CSQ: %d", &index)>0) {
szapataa 0:fbcbe8ca7fae 195 break; /*si lee que la rta al comando AT+CSQ es mayor a ceso, sale del bucle*/
szapataa 0:fbcbe8ca7fae 196 }
szapataa 0:fbcbe8ca7fae 197 count++; /*aumenta el contador*/
szapataa 0:fbcbe8ca7fae 198 wait(1); /*espera 1 segundo*/
szapataa 0:fbcbe8ca7fae 199 }
szapataa 0:fbcbe8ca7fae 200
szapataa 0:fbcbe8ca7fae 201 if(count == 3) {
szapataa 0:fbcbe8ca7fae 202 return -1; /*si count es igual a 3, el intento falló*/
szapataa 0:fbcbe8ca7fae 203 }
szapataa 0:fbcbe8ca7fae 204 return index; /*finaliza el ciclo de verificación*/
szapataa 0:fbcbe8ca7fae 205 }
szapataa 0:fbcbe8ca7fae 206
szapataa 0:fbcbe8ca7fae 207 /* esta funcion de abajo inicaliza el modem se compone de un grupo de subfunciones ya definidas previamente
szapataa 0:fbcbe8ca7fae 208 primero chequea que este vivo
szapataa 0:fbcbe8ca7fae 209 segundo chequea el estado de la simcard
szapataa 0:fbcbe8ca7fae 210 tercero chequea la intencidad de señal celular
szapataa 0:fbcbe8ca7fae 211 cuarto aplica la configuracion
szapataa 0:fbcbe8ca7fae 212 y si todo sale bien retorna un cero que en la programacion hay que validar
szapataa 0:fbcbe8ca7fae 213 con alguna expresion logica
szapataa 0:fbcbe8ca7fae 214 */
szapataa 0:fbcbe8ca7fae 215 //***************************************************************************************
szapataa 0:fbcbe8ca7fae 216 int init()
szapataa 0:fbcbe8ca7fae 217 {
szapataa 0:fbcbe8ca7fae 218 if (0 != sendCmdAndWaitForResp("AT\r\n", "OK", 3)){ /*comprobamos la disponibilidad del dispositivo*/
szapataa 0:fbcbe8ca7fae 219 return -1;
szapataa 0:fbcbe8ca7fae 220 }
szapataa 0:fbcbe8ca7fae 221 if (0 != sendCmdAndWaitForResp("AT+CNMI=1,1\r\n", "OK", 3)){ /*actuva un evento cada vez que un sms ha llegado*/
szapataa 0:fbcbe8ca7fae 222 return -1;
szapataa 0:fbcbe8ca7fae 223 }
szapataa 0:fbcbe8ca7fae 224 if (0 != sendCmdAndWaitForResp("AT+CMGF=0\r\n", "OK", 3)){ /*comprobamos que el modem esté listo para operar en modo SMS texto*/
szapataa 0:fbcbe8ca7fae 225 return -1;
szapataa 0:fbcbe8ca7fae 226 }
szapataa 0:fbcbe8ca7fae 227 if (0 != sendCmdAndWaitForResp("AT+CBST=0,0,1\r\n", "OK", 3)){ /*comprueba queestn vbien ajustados los parámetros de funcionamiento del modem*/
szapataa 0:fbcbe8ca7fae 228 return -1;
szapataa 0:fbcbe8ca7fae 229 }
szapataa 0:fbcbe8ca7fae 230 LedVerde=0; /*prende led verde*/
szapataa 0:fbcbe8ca7fae 231 return 0;
szapataa 0:fbcbe8ca7fae 232 }
szapataa 0:fbcbe8ca7fae 233
szapataa 0:fbcbe8ca7fae 234 /* esta funcion de abajo intenta leer un mensaje de texto en formato PDU o HEX
szapataa 0:fbcbe8ca7fae 235 y si todo sale bien retorna un cero que en la programacion hay que validar
szapataa 0:fbcbe8ca7fae 236 con alguna expresion logica
szapataa 0:fbcbe8ca7fae 237 */
szapataa 0:fbcbe8ca7fae 238 //***************************************************************************************
szapataa 0:fbcbe8ca7fae 239 int readSMSpdu(char *message, int index) /*funcion para leer los mensajes*/
szapataa 0:fbcbe8ca7fae 240 {
szapataa 0:fbcbe8ca7fae 241 int i = 0; /*inicializa i*/
szapataa 0:fbcbe8ca7fae 242 char gprsBuffer[100]; /*genera una cadena de 100 posiciones*/
szapataa 0:fbcbe8ca7fae 243 char *p,*s;
szapataa 0:fbcbe8ca7fae 244 GSM.printf("AT+CMGR=%d\r\n",index); /*recupera el mensaje del puerto GSM y lo imprime en la pantalla*/
szapataa 0:fbcbe8ca7fae 245 cleanBuffer(gprsBuffer,100); /*limpia el buffer*/
szapataa 0:fbcbe8ca7fae 246 readBuffer(gprsBuffer,100); /*lee el buffer*/
szapataa 0:fbcbe8ca7fae 247 if(NULL == ( s = strstr(gprsBuffer,"+CMGR"))) { /*si el buffer esta vacío presenta un error*/
szapataa 0:fbcbe8ca7fae 248 return -1;
szapataa 0:fbcbe8ca7fae 249 }
szapataa 0:fbcbe8ca7fae 250 if(NULL != ( s = strstr(gprsBuffer,"+32"))) { /*si el buffer está*/
szapataa 0:fbcbe8ca7fae 251 p = s + 6;
szapataa 0:fbcbe8ca7fae 252 while((*p != '$')&&(i < 5)) {
szapataa 0:fbcbe8ca7fae 253 message[i++] = *(p++);
szapataa 0:fbcbe8ca7fae 254 }
szapataa 0:fbcbe8ca7fae 255 message[i] = '\0'; /*finaliza la cadena*/
szapataa 0:fbcbe8ca7fae 256 }
szapataa 0:fbcbe8ca7fae 257 return 0; /*termina el ciclico*/
szapataa 0:fbcbe8ca7fae 258 }
szapataa 0:fbcbe8ca7fae 259 /* esta funcion de abajo borra mensajes SMS del modem
szapataa 0:fbcbe8ca7fae 260 y si todo sale bien retorna un cero que en la programacion hay que validar
szapataa 0:fbcbe8ca7fae 261 con alguna expresion logica
szapataa 0:fbcbe8ca7fae 262 */
szapataa 0:fbcbe8ca7fae 263 //***************************************************************************************
szapataa 0:fbcbe8ca7fae 264 int deleteSMS(int index)
szapataa 0:fbcbe8ca7fae 265 {
szapataa 0:fbcbe8ca7fae 266 char cmd[32]; /*asigna una cadena de 32 posiciones*/
szapataa 0:fbcbe8ca7fae 267 snprintf(cmd,sizeof(cmd),"AT+CMGD=%d\r\n",index); /*imprime que el mensaje fue borrado*/
szapataa 0:fbcbe8ca7fae 268 sendCmd(cmd); /*envía comando cmd*/
szapataa 0:fbcbe8ca7fae 269 return 0; /*termina la instrucción de borrado*/
szapataa 0:fbcbe8ca7fae 270 }
szapataa 0:fbcbe8ca7fae 271 //************************************************************************************
szapataa 0:fbcbe8ca7fae 272
szapataa 0:fbcbe8ca7fae 273 //RUTINA PRINCIPAL*******************************************************************************************
szapataa 0:fbcbe8ca7fae 274 int main(void)
szapataa 0:fbcbe8ca7fae 275 {
szapataa 0:fbcbe8ca7fae 276 //configuramos los puertos seriales
szapataa 0:fbcbe8ca7fae 277 GSM.baud(9600);//configura los baudios de la FRDMKL25Z en 9600
szapataa 0:fbcbe8ca7fae 278 GSM.format(8,Serial::None,1); //configura el formato de los datos de la UART
szapataa 0:fbcbe8ca7fae 279 //apagamos los 3 leds
szapataa 0:fbcbe8ca7fae 280 LedVerde=1; /*inicia el led verde apagado*/
szapataa 0:fbcbe8ca7fae 281 LedRojo=1; /*inicia el led rojo apagado*/
szapataa 0:fbcbe8ca7fae 282 LedAzul=1; /*inicia el led azul apagado*/
szapataa 0:fbcbe8ca7fae 283 //quito el eco del modem
szapataa 0:fbcbe8ca7fae 284 GSM.printf("ATE0\r\n"); /*imprime en el puerto del GSM que el ATE0 elimina el eco del modém*/
szapataa 0:fbcbe8ca7fae 285 pc.printf("ATE0\r\n"); /*imprime en el pc que el ATE0 elimina el eco del modém*/
szapataa 0:fbcbe8ca7fae 286 for(i=0;i<6;i++){
szapataa 0:fbcbe8ca7fae 287 GSM.printf("AT+CMGD=%d\r\n",i); /*con el comando AT+CMGD se boran los mensajes*/
szapataa 0:fbcbe8ca7fae 288 wait(0.2); /*espere 0.2 segundos*/
szapataa 0:fbcbe8ca7fae 289 }
szapataa 0:fbcbe8ca7fae 290 //cleanBuffer(buffer,10);
szapataa 0:fbcbe8ca7fae 291 //definicion de algunas variables
szapataa 0:fbcbe8ca7fae 292 lenpack=6; //tamaño de "ALARMA"
szapataa 0:fbcbe8ca7fae 293 //Configuro el Modem, le doy solo 10 intentos si esos fracasan se bloquea y prende intermitente el led rojo
szapataa 0:fbcbe8ca7fae 294 inicio:if(init()<0){ /*inicia el contador, suma hasta llegar a 10*/
szapataa 0:fbcbe8ca7fae 295 intentos++;
szapataa 0:fbcbe8ca7fae 296 if (intentos==10){goto loop1;} /*si llega a 10 intentos se reinicia el programa*/
szapataa 0:fbcbe8ca7fae 297 goto inicio;
szapataa 0:fbcbe8ca7fae 298 }
szapataa 0:fbcbe8ca7fae 299 //cleanBuffer(buffer,50);
szapataa 0:fbcbe8ca7fae 300 //inicia el programa ciclico
szapataa 0:fbcbe8ca7fae 301 //esperar señales de alarma por boton1
szapataa 0:fbcbe8ca7fae 302 //se envia "Alarma1"
szapataa 0:fbcbe8ca7fae 303 //al telefono que envio mensaje antes
szapataa 0:fbcbe8ca7fae 304
szapataa 0:fbcbe8ca7fae 305 //*********************************************************************************************************************
szapataa 0:fbcbe8ca7fae 306 while(1){
szapataa 0:fbcbe8ca7fae 307 if (button1.falling()) /*inicia con el boton 1*/
szapataa 0:fbcbe8ca7fae 308 {
szapataa 0:fbcbe8ca7fae 309 wait(2); /*espera 2 segundos*/
szapataa 0:fbcbe8ca7fae 310 if (!button1) /*entra si se activa el boton 1*/
szapataa 0:fbcbe8ca7fae 311 {
szapataa 0:fbcbe8ca7fae 312 //inicia el envio de un sms
szapataa 0:fbcbe8ca7fae 313 index=19;
szapataa 0:fbcbe8ca7fae 314 GSM.printf("AT+CMGS=%d\r\n",index); /*envía un mensahe al numero seleccionado*/
szapataa 0:fbcbe8ca7fae 315 wait(0.2); /*espera 0.2 segundos*/
szapataa 0:fbcbe8ca7fae 316 GSM.printf("0011000A91");
szapataa 0:fbcbe8ca7fae 317 GSM.printf("%s",tel); /*imprime el numero de telefono*/
szapataa 0:fbcbe8ca7fae 318 GSM.printf("0000AA07417658DE0EC7");
szapataa 0:fbcbe8ca7fae 319 GSM.printf("\r\n");
szapataa 0:fbcbe8ca7fae 320 wait(0.2); /*espera 0.2 segundosj*/
szapataa 0:fbcbe8ca7fae 321 GSM.putc(0x1A); //el mensaje ya fue enviado con esto
szapataa 0:fbcbe8ca7fae 322 for(i=0;i<6;i++){ /*pone a parpadear el led verde*/
szapataa 0:fbcbe8ca7fae 323 LedVerde=1;
szapataa 0:fbcbe8ca7fae 324 wait(0.5);
szapataa 0:fbcbe8ca7fae 325 LedVerde=0;
szapataa 0:fbcbe8ca7fae 326 wait(0.5);
szapataa 0:fbcbe8ca7fae 327 }
szapataa 0:fbcbe8ca7fae 328 }
szapataa 0:fbcbe8ca7fae 329 }
szapataa 0:fbcbe8ca7fae 330
szapataa 0:fbcbe8ca7fae 331
szapataa 0:fbcbe8ca7fae 332
szapataa 0:fbcbe8ca7fae 333 //inicia la recepcion de un mensaje de texto
szapataa 0:fbcbe8ca7fae 334 if (GSM.readable()) { /*lee el puerto GSM*/
szapataa 0:fbcbe8ca7fae 335 readBuffer(buffer,100); /*lee el buffer*/
szapataa 0:fbcbe8ca7fae 336 pc.printf("%s\r\n",buffer); /*imprime ljo que encontro en el buffer*/
szapataa 0:fbcbe8ca7fae 337 for(i=0;i<5;i++)
szapataa 0:fbcbe8ca7fae 338 {
szapataa 0:fbcbe8ca7fae 339 resp[i]=buffer[i]; /*arma una cadena con lo que encontro en el buffer*/
szapataa 0:fbcbe8ca7fae 340 }
szapataa 0:fbcbe8ca7fae 341
szapataa 0:fbcbe8ca7fae 342 pc.printf("%s\r\n",resp);
szapataa 0:fbcbe8ca7fae 343 if(strcmp("$$+CM",resp) == 0){ //COMPARA resp con "+CMTI"
szapataa 0:fbcbe8ca7fae 344 pc.printf("llego MSG\r\n"); /*avisa que llego el sms*/
szapataa 0:fbcbe8ca7fae 345 cleanBuffer(buffer,10); /*limpia el buffer*/
szapataa 0:fbcbe8ca7fae 346 wait(0.5);/*espera medio segundo*/
szapataa 0:fbcbe8ca7fae 347 GSM.printf("AT+CMGL=0\r\n");//envio comando para leer mensaje
szapataa 0:fbcbe8ca7fae 348 pc.printf("AT+CMGL=0\r\n"); /*recupera todos los mensajes*/
szapataa 0:fbcbe8ca7fae 349 //if (GSM.readable()) {
szapataa 0:fbcbe8ca7fae 350 GSM.printf("AT+CMGD=0\r\n"); /*borra el mensaje */
szapataa 0:fbcbe8ca7fae 351 readBuffer(buffer,100); /*lee el buffer*/
szapataa 0:fbcbe8ca7fae 352 pc.printf("%s\r\n",buffer); /*imprime lo que lee anteriormente en el buffer*/
szapataa 0:fbcbe8ca7fae 353 wait(5); /*espera 5 segundos*/
szapataa 0:fbcbe8ca7fae 354 //leer telefono
szapataa 0:fbcbe8ca7fae 355 for(i=0;i<10;i++){
szapataa 0:fbcbe8ca7fae 356 tel[i]=buffer[i+40]; /*compone el numero de telefono*/
szapataa 0:fbcbe8ca7fae 357 }
szapataa 0:fbcbe8ca7fae 358 pc.printf("%s-\r\n",tel); /*imprime el numero de telefono*/
szapataa 0:fbcbe8ca7fae 359 //leer tamaño
szapataa 0:fbcbe8ca7fae 360 for(i=0;i<2;i++){
szapataa 0:fbcbe8ca7fae 361 tam[i]=buffer[i+68]; /*compone el tamaño de la trama*/
szapataa 0:fbcbe8ca7fae 362 }
szapataa 0:fbcbe8ca7fae 363 pc.printf("%s-\r\n",tam); /*imprime el tamaño de la trama*/
szapataa 0:fbcbe8ca7fae 364 //leer mensaje
szapataa 0:fbcbe8ca7fae 365 for(i=0;i<14;i++){
szapataa 0:fbcbe8ca7fae 366 msg[i]=buffer[i+70]; /*compone el mensaje*/
szapataa 0:fbcbe8ca7fae 367 }
szapataa 0:fbcbe8ca7fae 368 pc.printf("%s-\r\n",msg); /*imprime el mensaje*/
szapataa 0:fbcbe8ca7fae 369 //decodificar mensaje
szapataa 0:fbcbe8ca7fae 370 //comparar mensaje
szapataa 0:fbcbe8ca7fae 371 if(strcmp("417658DE0EC700",msg) == 0){ //COMPARA resp con "417658DE0EC700" que es Alarma1
szapataa 0:fbcbe8ca7fae 372 LedVerde=1; /*apagado el led verde*/
szapataa 0:fbcbe8ca7fae 373 LedAzul=0; /*encendido el led azul*/
szapataa 0:fbcbe8ca7fae 374 wait(15); /*espera 15 segundos*/
szapataa 0:fbcbe8ca7fae 375 LedAzul=1; /*apaga el led azul*/
szapataa 0:fbcbe8ca7fae 376 LedVerde=0; /*enciende el led verde*/
szapataa 0:fbcbe8ca7fae 377 }
szapataa 0:fbcbe8ca7fae 378 if(strcmp("417658DE0ECB00",msg) == 0){ //COMPARA resp con "417658DE0ECB00" que es Alarma2
szapataa 0:fbcbe8ca7fae 379 LedVerde=1; /*apagado el led verde*/
szapataa 0:fbcbe8ca7fae 380 LedRojo=0; /*enciende el led rojo*/
szapataa 0:fbcbe8ca7fae 381 wait(15); /*espera 15 segundos*/
szapataa 0:fbcbe8ca7fae 382 LedRojo=1; /*apaga el led rojo*/
szapataa 0:fbcbe8ca7fae 383 LedVerde=0; /*enciende el led verde*/
szapataa 0:fbcbe8ca7fae 384 }
szapataa 0:fbcbe8ca7fae 385
szapataa 0:fbcbe8ca7fae 386
szapataa 0:fbcbe8ca7fae 387 //ejecurar orden //ya se ejecuto
szapataa 0:fbcbe8ca7fae 388 //08-D6379B1E569763 esto es Voltaje1
szapataa 0:fbcbe8ca7fae 389
szapataa 0:fbcbe8ca7fae 390
szapataa 0:fbcbe8ca7fae 391 cleanBuffer(buffer,100); /*limpia el buffer*/
szapataa 0:fbcbe8ca7fae 392
szapataa 0:fbcbe8ca7fae 393 }
szapataa 0:fbcbe8ca7fae 394 }
szapataa 0:fbcbe8ca7fae 395
szapataa 0:fbcbe8ca7fae 396
szapataa 0:fbcbe8ca7fae 397 }
szapataa 0:fbcbe8ca7fae 398
szapataa 0:fbcbe8ca7fae 399
szapataa 0:fbcbe8ca7fae 400 //**********************************************************************************************************************
szapataa 0:fbcbe8ca7fae 401 loop1: LedRojo=0; /*inicia a titilar el led rojo, manteniendolo en 0.3 segundos encendido y 0.3 segundos apagado*/
szapataa 0:fbcbe8ca7fae 402 wait(0.3);
szapataa 0:fbcbe8ca7fae 403 LedRojo=1;
szapataa 0:fbcbe8ca7fae 404 wait(0.3);
szapataa 0:fbcbe8ca7fae 405 goto loop1;
szapataa 0:fbcbe8ca7fae 406
szapataa 0:fbcbe8ca7fae 407 }