uui

Dependencies:   DebouncedIn mbed

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers main.cpp Source File

main.cpp

00001 //  Programa para enviar desde la FRDMKL25Z un mensaje de texto en formatp PDU
00002 //   Como modem usa un celular SIEMENS a56i
00003 //   ENVIAR -----la palabra "ALARMA 1"
00004 //  
00005 
00006 //   OJO CON ESTO
00007 //   conector del siemens cable verde es RX conectelo a PTE0  cable blanco es TX conectelo a PTE1
00008 #include "mbed.h"
00009 #include "DebouncedIn.h"
00010 #include "stdio.h"
00011 #include "string.h"
00012 Timer t;
00013 DigitalOut LedVerde(LED2);
00014 DigitalOut LedRojo(LED1);
00015 DigitalOut LedAzul(LED3);
00016 DebouncedIn button1(PTC11);  //Envio de msn
00017 Serial GSM(PTE0,PTE1); //Configuracion de UART de la FRDMKL25Z
00018 Serial pc(USBTX,USBRX);//Configuracion USB a la consola serial del PC conectado.
00019 void Rx_interrupt();
00020 int position=0;
00021 int lenpack=6;
00022 int longi=0;
00023 char tel[10];
00024 char DE[50];
00025 char buffer[512];
00026 char buffermsg[72];
00027 char buffer1[13];
00028 char mensaje[100];
00029 char NUMBER[13];    
00030 int index;
00031 int count;
00032 int i = 0;
00033 int c=0;
00034 int cont=0;
00035 unsigned char CtrlZ = 0x1A; 
00036 bool Flag = false; //flag 
00037 char r[]=""; //Cadena de recepcion de la trama PDU si se usa!!
00038 char msg[256];
00039 char char1;
00040 //Flush serial para el buffer
00041 void FlushGSM(void) { 
00042 char1 = 0;
00043  while (GSM.readable()){
00044      char1 = GSM.getc();}
00045      return;}
00046 
00047 void callback() {
00048     // Note: you need to actually read from the serial to clear the RX interrupt
00049     pc.printf("%c\n", GSM.getc());
00050     
00051 }
00052  
00053 int readBuffer(char *buffer,int count)
00054 {
00055     int i=0; 
00056     t.start();  
00057     while(1) {
00058         while (GSM.readable()) {
00059             char c = GSM.getc();
00060             if (c == '\r' || c == '\n') c = '$';
00061             buffer[i++] = c;
00062             if(i > count)break;
00063         }
00064         if(i > count)break;
00065         if(t.read() > 3) {
00066             t.stop();
00067             t.reset();
00068             break;
00069         }
00070     }
00071     wait(0.2);
00072     while(GSM.readable()) {  // display the other thing..
00073         char c = GSM.getc();
00074     }
00075     return 0;
00076 }
00077 
00078 /* esta funcion de abajo limpia o borra todo un "buffer" de tamaño "count"
00079 lo revisa uno por un elemento y le mete el caracter null que indica fin de cadena
00080 no retorna nada
00081 */
00082 //***************************************************************************************
00083 void cleanBuffer(char *buffer, int count)
00084 {
00085     for(int i=0; i < count; i++) {
00086         buffer[i] = '\0';
00087     }
00088 }
00089 /* esta funcion de abajo envia un comando parametrizado como cadena
00090 */
00091 //***************************************************************************************
00092 void sendCmd(char *cmd)
00093 {
00094     GSM.puts(cmd);
00095 }
00096 /* esta funcion de abajo espera la respuesta de un comando que debe ser identica a la cadena "resp" y un tiempo timeout"
00097 si todo sale bien retorna un cero que en la programacion hay que validar
00098 si algo sale mal ( no se parece o se demora mucho )retorna -1 que debera validarse con alguna expresion logica
00099 */
00100 //***************************************************************************************
00101 int waitForResp(char *resp, int timeout)
00102 {
00103     int len = strlen(resp);
00104     int sum=0;
00105     t.start();
00106 
00107     while(1) {
00108         if(GSM.readable()) {
00109             char c = GSM.getc();
00110             sum = (c==resp[sum]) ? sum+1 : 0;// esta linea de C# sum se incrementa o se hace cero segun c
00111             if(sum == len)break;  //ya acabo se sale
00112         }
00113         if(t.read() > timeout) {  // time out chequea el tiempo minimo antes de salir perdiendo
00114             t.stop();
00115             t.reset();
00116             return -1;
00117         }
00118     }
00119     t.stop();                 // stop timer  antes de retornar
00120     t.reset();                    // clear timer
00121     while(GSM.readable()) {      // display the other thing..
00122         char c = GSM.getc();
00123     }
00124 
00125     return 0;
00126 }
00127 /* esta funcion de abajo es muy completa e util se encarga de enviar el comando y esperar la respuesta
00128 si todo sale bien retorna un cero(herencia de las funciones contenedoras) que en la programacion hay que validar
00129 con alguna expresion logica
00130 */
00131 //***************************************************************************************
00132 int sendCmdAndWaitForResp(char *cmd, char *resp, int timeout)
00133 {
00134     sendCmd(cmd);
00135     return waitForResp(resp,timeout);
00136 }
00137 /* esta funcion de abajo chequea que el modem este vivo  envia AT y le contesta con OK y espera 2 segundos
00138 */
00139 //***************************************************************************************
00140 int powerCheck(void)// este comando se manda para verificar si el modem esta vivo o conectado
00141 {
00142     return sendCmdAndWaitForResp("AT\r\n", "OK", 2);    
00143 }
00144 /* esta funcion de abajo chequea el estado de la sim card
00145 y si todo sale bien retorna un cero que en la programacion hay que validar
00146 con alguna expresion logica
00147 */
00148 //***************************************************************************************
00149 int checkSIMStatus(void)
00150 {
00151     char gprsBuffer[30];
00152     int count = 0;
00153     cleanBuffer(gprsBuffer,30);
00154     while(count < 3) {
00155         sendCmd("AT+CPIN?\r\n");
00156         readBuffer(gprsBuffer,30);
00157         if((NULL != strstr(gprsBuffer,"+CPIN: READY"))) {
00158             break;
00159         }
00160         count++;
00161         wait(0.2);
00162     }
00163 
00164     if(count == 3) {
00165         return -1;
00166     }
00167     return 0;
00168 }
00169 /* esta funcion de abajo chequea la calidad de la señal
00170 y si todo sale bien retorna cun el valor de señal util o un -1 si nop es aceptable, en la programacion hay que validar
00171 con alguna expresion logica
00172 */
00173 //***************************************************************************************
00174 int checkSignalStrength(void)
00175 {
00176     char gprsBuffer[100];
00177     int index,count = 0;
00178     cleanBuffer(gprsBuffer,100);
00179     while(count < 3) {
00180         sendCmd("AT+CSQ\r\n");
00181         readBuffer(gprsBuffer,25);
00182         if(sscanf(gprsBuffer, "AT+CSQ$$$$+CSQ: %d", &index)>0) {
00183             break;
00184         }
00185         count++;
00186         wait(1);
00187     }
00188     if(count == 3) {
00189         return -1;
00190     }
00191     return index;
00192 }
00193 
00194 /* esta funcion de abajo inicaliza el modem se compone de un grupo de subfunciones ya definidas previamente
00195 primero chequea que este vivo
00196 segundo chequea el estado de la simcard
00197 tercero chequea la intencidad de señal celular
00198 cuarto aplica la configuracion
00199 y si todo sale bien retorna un cero que en la programacion hay que validar
00200 con alguna expresion logica
00201 */
00202 //***************************************************************************************
00203 int init()
00204 {
00205     for(int i = 0; i < 3; i++){
00206         sendCmdAndWaitForResp("AT\r\n", "OK", 1);
00207         wait(0.5);
00208     }
00209     if(0 != checkSIMStatus()) {
00210         return -1;
00211     }
00212     if(checkSignalStrength()<1) {
00213         return -1;
00214     }
00215    
00216     GSM.attach(&Rx_interrupt, Serial::RxIrq);
00217     return 0;
00218 }
00219 /* esta funcion de abajo intenta leer un mensaje de texto en formato PDU o HEX
00220 y si todo sale bien retorna un cero que en la programacion hay que validar
00221 con alguna expresion logica
00222 */
00223 //***************************************************************************************
00224 int readSMSpdu(char *message, int index)
00225 {
00226     int i = 0;
00227     char gprsBuffer[100];
00228     char *p,*s;
00229     GSM.printf("AT+CMGR=%d\r\n",index);
00230     cleanBuffer(gprsBuffer,100);
00231     readBuffer(gprsBuffer,100);
00232     if(NULL == ( s = strstr(gprsBuffer,"+CMGR"))) {
00233         return -1;
00234     }
00235     if(NULL != ( s = strstr(gprsBuffer,"+32"))) {
00236         p = s + 6;
00237         while((*p != '$')&&(i < 5)) {
00238             message[i++] = *(p++);
00239         }
00240         message[i] = '\0';
00241     }
00242     return 0;
00243 }
00244 /* esta funcion de abajo borra mensajes SMS del modem
00245 y si todo sale bien retorna un cero que en la programacion hay que validar
00246 con alguna expresion logica
00247 */
00248 
00249 int deleteSMS(int index)
00250 {
00251     char cmd[32];
00252     snprintf(cmd,sizeof(cmd),"AT+CMGD=%d\r\n",index);
00253     sendCmd(cmd);
00254     return 0;
00255 }
00256 //***0*********************************************************************************
00257 
00258 // Interupt Routine to read in data from serial port
00259 void Rx_interrupt(){
00260      }
00261      
00262 int main(void)
00263        { 
00264        //NVIC_DisableIRQ(UART1_IRQn);       
00265        //apagamos los 3 leds
00266        LedVerde=1;
00267        LedRojo=1;
00268        LedAzul=1;
00269        lenpack=6;  //tamaño de "ALARMA"
00270        GSM.baud(9600);//configura los baudios de la FRDMKL25Z en 9600
00271        GSM.format(8,Serial::None,1); //configura el formato de los datos de la UART
00272        //configuro modem GSM
00273        GSM.printf("AT\r\n");
00274        wait(0.2);
00275        GSM.printf("AT+CNMI=1,1\r\n");
00276        wait(0.2);
00277        GSM.printf("AT+CMGF=0\r\n");
00278        wait(0.2);
00279        GSM.printf("ATE\r\n");
00280        wait(0.2);
00281        GSM.printf("CBST=0,0,1\r\n");
00282        wait(0.2);  
00283        LedVerde=0;  
00284        wait(1);
00285        LedVerde=1;   
00286       
00287       while(1){ 
00288       
00289        if (button1.falling()){
00290           LedVerde=0;
00291           //LedRojo=0;
00292           LedAzul=0;
00293           //wait(1);
00294           
00295        index=22;
00296        GSM.printf("AT+CMGS=%d\r\n",index);
00297        wait(0.2);
00298        GSM.printf("0011000A9113686977910000AA07E1319A5E779F01"); //Enviar Advertencia
00299        wait(0.2);
00300        GSM.putc((char)0x1A); //esto es controlZ   
00301        wait(2);
00302        //LedRojo=1;
00303        LedAzul=1;
00304        LedVerde=1;     //se apaga
00305        
00306        }  
00307       
00308        if (GSM.readable()) {
00309             readBuffer(buffer,100);
00310             pc.printf("buffer= %s\n\r ",buffer);
00311             pc.printf("buffer= %c  %c\n\r ",buffer[10],buffer[11]);
00312                 if(buffer[67]=='A'){for(i=0;i<86;i++){
00313                  buffermsg[i]=buffer[i];}
00314                  //pc.printf("mensaje= %s\n\r ",buffermsg); 
00315                  //pc.printf("mensaje[72]= %c mensaje[73]=%c\n\r ",buffermsg[72],buffermsg[73]);        
00316                  buffer[67]='c';
00317                  }
00318                  
00319     if(buffer[10]=='S'&& buffer[11]=='M'){
00320              for(i=0;i<5;i++)
00321              {
00322              buffer1[i]=buffer[2+i];
00323              }
00324              pc.printf("buffer1= %s\n\r ",buffer1);         
00325              buffer[10]='c';
00326              buffer[11]='c';
00327              }
00328              
00329     if(buffer1[3]=='T'){
00330             pc.printf("AT+CMGL=0\n\r");
00331             wait(0.2);
00332             GSM.printf("AT+CMGL=0\r\n");
00333             buffer1[3]='p';
00334             }
00335             
00336             if(buffermsg[70]=='6' && buffermsg[71]=='F'){
00337             LedRojo=0;
00338             LedVerde=0;
00339             LedAzul=0;
00340             //wait(0.2);
00341                 /*index=22;
00342                 GSM.printf("AT+CMGS=%d\r\n",index);
00343                 wait(0.2);
00344                 GSM.printf("0011000A9113686977910000AA0A61F77C8C0EB3E96537"); //Enviar confirmacion
00345                 wait(0.2);
00346                 GSM.putc((char)0x1A);*/ //esto es controlZ}
00347         }
00348             if(buffermsg[70]=='6' && buffermsg[71]=='3'){
00349             LedRojo=1;
00350             LedVerde=1;
00351             LedAzul=1;
00352             //wait(0.2);
00353                 /*index=22;
00354                 GSM.printf("AT+CMGS=%d\r\n",index);
00355                 wait(0.2);
00356                 GSM.printf("0011000A9113686977910000AA0BE1FA7C3E4687D9F4B21B"); //Enviar confirmacion
00357                 wait(0.2);
00358                 GSM.putc((char)0x1A); //esto es controlZ}*/
00359             }
00360 
00361 }
00362 }
00363 }