![](/media/cache/img/default_profile.jpg.50x50_q85.jpg)
comentarios sobre el código del gsm_tarea celular
Dependencies: DebouncedIn mbed
main.cpp@0:fbcbe8ca7fae, 2015-11-24 (annotated)
- 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?
User | Revision | Line number | New 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 | } |