uui
Dependencies: DebouncedIn mbed
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 }
Generated on Fri Aug 5 2022 02:42:42 by 1.7.2