Entrega tarea GSM grupo verde procesadores 2019-1

Dependencies:   mbed GPS Library DebounceIn DebouncedIn

Files at this revision

API Documentation at this revision

Comitter:
SusanaBM
Date:
Fri Aug 30 20:56:39 2019 +0000
Commit message:
Termple;

Changed in this revision

DebounceIn.lib Show annotated file Show diff for this revision Revisions of this file
DebouncedIn.lib Show annotated file Show diff for this revision Revisions of this file
GPS-Library.lib Show annotated file Show diff for this revision Revisions of this file
main.cpp Show annotated file Show diff for this revision Revisions of this file
mbed.bld Show annotated file Show diff for this revision Revisions of this file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DebounceIn.lib	Fri Aug 30 20:56:39 2019 +0000
@@ -0,0 +1,1 @@
+https://os.mbed.com/users/AjK/code/DebounceIn/#31ae5cfb44a4
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DebouncedIn.lib	Fri Aug 30 20:56:39 2019 +0000
@@ -0,0 +1,1 @@
+https://os.mbed.com/users/cmorab/code/DebouncedIn/#dc1131de43e8
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/GPS-Library.lib	Fri Aug 30 20:56:39 2019 +0000
@@ -0,0 +1,1 @@
+https://os.mbed.com/users/nliu96/code/GPS-Library/#120983998da2
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Fri Aug 30 20:56:39 2019 +0000
@@ -0,0 +1,717 @@
+//Librerias
+#include "mbed.h"
+#include "DebouncedIn.h"
+#include "stdio.h"
+#include "string.h"
+#include "GPS.h"
+
+// Temporizador
+Timer t;
+
+////////////////////////////// ASIGNACIÓN DE PINES \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
+
+// SALIDAS: digitales
+DigitalOut LedVerde(LED2);  // GSM
+DigitalOut LedRojo(LED1);   // Conexión incorrecta
+DigitalOut LedAzul(LED3);   // GPS
+DigitalOut valvula(PTC4);   // Salida de la valvula
+DigitalOut puerta(PTC6);    // Salida de la puerta
+
+// ENTRADAS: digital y análoga
+DigitalIn sin_gps(PTA13);
+AnalogIn v(PTB0);
+float medi;
+
+// PUERTOS: Modem GSM SIMENS y el GPS virtual
+Serial GSM(PTE0, PTE1);  // TX y RX para el Modem
+Serial pc(USBTX, USBRX); // Comunicación del PC al dongle, para comunicar el FPS
+GPS gps(PTE22, PTE23);   // TX y RX para el Dongle
+
+////////////////////////////// VARIABLES \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
+
+// VARIABLES: cadenas de caracteres
+char DE1[255];
+char DS1[255];
+char DE2[255];
+char DS2[255];
+char buffer[512];
+char resp[6];
+char tam[2];
+char mensaje[100];
+char gprsBuffer[30];
+
+// VARIABLES: enteras y caracteres
+int g = 0;
+int count;
+int i, K, LENOUT1, LENIN1, LENOUT2, LENIN2, C;
+int c = 0;
+char r[] = "";
+char msg[256];
+char char1;
+int ind;
+float med;
+char outmed[16], outmedn[16];
+int ret = 1;
+
+// VARIABLES: adquisición de números de teléfono emisor
+char tel[15];
+
+// VARIABLES: coordenadas en latitud y longitud
+float lo, la;
+char clo[255], cla[255]; // Cadenas a capturar para latitud y longitud.
+char la_lo[255], volt[255];
+
+// VARIABLES: cadena de google maps
+char http2[255];
+char http[] = "http://maps.google.com/maps?q=";
+char buf[100];
+
+// VARIABLES: relleno de datos propio del protocolo de SMS.
+char relle1[] = "0011000A91";
+char relle2[] = "0000AA";
+
+//***********************************************************************
+// Reverses a string 'str' of length 'len'
+// driver program to test above funtion.
+void reverse(char *str, int len)
+{
+  int i = 0, j = len - 1, temp;
+  while (i < j)
+  {
+    temp = str[i];
+    str[i] = str[j];
+    str[j] = temp;
+    i++;
+    j--;
+  }
+}
+
+// Converts a given integer x to string str[].  d is the number
+// of digits required in output. If d is more than the number
+// of digits in x, then 0s are added at the beginning.
+int intToStr(int x, char str[], int d)
+{
+  int i = 0;
+  while (x)
+  {
+    str[i++] = (x % 10) + '0';
+    x = x / 10;
+  }
+
+  // If number of digits required is more, then
+  // add 0s at the beginning
+  while (i < d)
+    str[i++] = '0';
+
+  reverse(str, i);
+  str[i] = '\0';
+  return i;
+}
+
+// Converts a floating point number to string.
+void ftoa(float n, char *res, int afterpoint)
+{
+  // Extract integer part
+  int ipart = (int)n;
+
+  // Extract floating part
+  float fpart = n - (float)ipart;
+
+  // convert integer part to string
+  int i = intToStr(ipart, res, 0);
+
+  // check for display option after point
+  if (afterpoint != 0)
+  {
+    res[i] = '.'; // add dot
+
+    // Get the value of fraction part upto given no.
+    // of points after dot. The third parameter is needed
+    // to handle cases like 233.007
+    float fp = 10;
+    fpart = fpart * pow(fp, afterpoint);
+
+    intToStr((int)fpart, res + i + 1, afterpoint);
+  }
+}
+//*************************************************************************
+
+////////////////////////////// FUNCIONES \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
+
+//FUNCIÓN: libreria para vaciar el modem
+void FlushGSM(void)
+{
+  char1 = 0;
+  while (GSM.readable())
+  {
+    char1 = GSM.getc();
+  }
+  return;
+}
+
+void callback()
+{
+  pc.printf("%c\n", GSM.getc());
+}
+
+// FUNCIÓN: lee un bufer hasta encontrar CR o LF, rellenando el resto de $
+int readBuffer(char *buffer, int count)
+{
+  int i = 0;
+  t.start(); // Iniciar temporizador
+  while (1)
+  {
+    while (GSM.readable())
+    {
+      char c = GSM.getc();
+      if (c == '\r' || c == '\n') c = '$';
+      buffer[i++] = c;
+      if (i > count)
+        break;
+    }
+    if (i > count)
+      break;
+    if (t.read() > 3)
+    {
+      t.stop();
+      t.reset();
+      break;
+    }
+  }
+  wait(0.5);
+  while (GSM.readable())
+  { // display the other thing..
+    char c = GSM.getc();
+  }
+  return 0;
+}
+
+// FUNCIÓN: limpia/borra todo un "buffer" de tamaño "count"
+void cleanBuffer(char *buffer, int count)
+{
+  for (int i = 0; i < count; i++)
+  {
+    buffer[i] = '\0';
+  }
+}
+
+// FUNCIÓN: envia un comando parametrizado como cadena (puede ser un
+//          comando tipo AT)
+void sendCmd(char *cmd)
+{
+  GSM.puts(cmd);
+}
+
+// FUNCIÓN: espera la respuesta de un comando que debe ser idéntica a la
+//          cadena "resp" y un tiempo "timeout"
+int waitForResp(char *resp, int timeout)
+{
+  int len = strlen(resp);
+  int sum = 0;
+  t.start();
+
+  while (1)
+  {
+    if (GSM.readable())
+    {
+      char c = GSM.getc();
+      sum = (c == resp[sum]) ? sum + 1 : 0; // esta linea de C# sum se incrementa o se hace cero segun c
+      if (sum == len)
+        break; //ya acabo se sale
+    }
+    if (t.read() > timeout)
+    { // time out chequea el tiempo minimo antes de salir perdiendo
+      t.stop();
+      t.reset();
+      return -1;
+    }
+  }
+  t.stop();  // stop timer  antes de retornar
+  t.reset(); // clear timer
+  while (GSM.readable())
+  { // display the other thing..
+    char c = GSM.getc();
+  }
+  return 0;
+}
+
+// FUNCIÓN: envia el comando y espera la respuesta
+int sendCmdAndWaitForResp(char *cmd, char *resp, int timeout)
+{
+  sendCmd(cmd);
+  return waitForResp(resp, timeout);
+}
+
+// FUNCIÓN: chequea que el modem este conectado
+int powerCheck(void)
+{ // Este comando se manda para verificar si el módem esta vivo o conectado.
+  return sendCmdAndWaitForResp("AT\r\n", "OK", 2);
+}
+
+// FUNCIÓN: chequea el estado de la SimCard
+int checkSIMStatus(void)
+{
+  char gprsBuffer[30];
+  int count = 0;
+  cleanBuffer(gprsBuffer, 30);
+  while (count < 3)
+  {
+    sendCmd("AT+CPIN?\r\n");
+    readBuffer(gprsBuffer, 30);
+    if ((NULL != strstr(gprsBuffer, "+CPIN: READY")))
+    {
+      break;
+    }
+    count++;
+    wait(1);
+  }
+
+  if (count == 3)
+  {
+    return -1;
+  }
+  return 0;
+}
+
+// FUNCIÓN: chequea la calidad de la señal
+int checkSignalStrength(void)
+{
+  char gprsBuffer[100];
+  int index, count = 0;
+  cleanBuffer(gprsBuffer, 100);
+  while (count < 3)
+  {
+    sendCmd("AT+CSQ\r\n");
+    readBuffer(gprsBuffer, 25);
+    if (sscanf(gprsBuffer, "AT+CSQ$$$$+CSQ: %d", &index) > 0)
+    {
+      break;
+    }
+    count++;
+    wait(1);
+  }
+  if (count == 3)
+  {
+    return -1;
+  }
+  return index;
+}
+
+// FUNCIÓN: inicializa el modem
+// 1) Chequea que el modem este conectado
+// 2) Chequea el estado de la SimCard
+// 3) Chequea la intenciada de la señal
+// 4) Aplica la configuración
+int init()
+{
+  if (0 != sendCmdAndWaitForResp("AT\r\n", "OK", 3))
+  {
+    return -1;
+  }
+  if (0 != sendCmdAndWaitForResp("AT+CNMI=1,1\r\n", "OK", 3))
+  {
+    return -1;
+  }
+  if (0 != sendCmdAndWaitForResp("AT+CMGF=0\r\n", "OK", 3))
+  {
+    return -1;
+  }
+  if (0 != sendCmdAndWaitForResp("AT+CBST=7,0,1\r\n", "OK", 3))
+  { //velocidad fija a 9600, modem asincronico no transparente
+    return -1;
+  }
+  if (0 != sendCmdAndWaitForResp("ATE\r\n", "OK", 3))
+  { //se le quita el eco al modem GSM
+    return -1;
+  }
+  LedVerde = 0;
+  return 0;
+}
+
+// FUNCIÓN: intenta leer un mensaje de texto en formato PDU o HEX
+int readSMSpdu(char *message, int index)
+{
+  int i = 0;
+  char gprsBuffer[100];
+  char *p, *s;
+  GSM.printf("AT+CMGR=%d\r\n", index);
+  cleanBuffer(gprsBuffer, 100);
+  readBuffer(gprsBuffer, 100);
+  if (NULL == (s = strstr(gprsBuffer, "+CMGR")))
+  {
+    return -1;
+  }
+  if (NULL != (s = strstr(gprsBuffer, "+32")))
+  {
+    p = s + 6;
+    while ((*p != '$') && (i < 5))
+    {
+      message[i++] = *(p++);
+    }
+    message[i] = '\0';
+  }
+  return 0;
+}
+
+// FUNCIÓN: borra mensajes SMS del modem
+int deleteSMS(int index)
+{
+  char cmd[32];
+  snprintf(cmd, sizeof(cmd), "AT+CMGD=%d\r\n", index);
+  sendCmd(cmd);
+  return 0;
+}
+
+// FUNCIÓN: devuelve la confirmación del mensaje a quien lo envio
+int recibe_ok()
+{
+  pc.printf("AT+CMGS=27\n\r");
+  GSM.printf("AT+CMGS=27\n\r");
+  wait(1);
+  GSM.printf("0011000A91%s0000AA10CDB27B1E569741F2F2382D4E93DF", tel);
+  GSM.printf("\n\r");
+  pc.printf("0011000A91%s0000AA10CDB27B1E569741F2F2382D4E93DF\n\r", tel);
+  pc.printf("\n\r"); //control+Z
+  wait(1);
+  return 0;
+}
+
+////////////////////////////// MAIN \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
+
+int main()
+{
+  //configuramos los puertos seriales
+  GSM.baud(9600);                 //configura los baudios de la FRDMKL25Z en 9600
+  GSM.format(8, Serial::None, 1); //configura el formato de los datos de la UART
+  LedVerde = 1;                   // APAGO LOS LEDS
+  LedRojo = 1;
+  LedAzul = 1;
+  LedRojo = 0; // PRENDO EL LED ROJO
+  valvula = 0; // se enciende la valvula por defecto
+
+// CONFIGURACIÓN DEL MODEM GSM
+inicio1:
+  ret = init();
+  if (ret == 0)
+  {                                   // esta bien conectado el modem GSM.........................................................................
+    LedRojo = 1;                      // apagar led rojo
+    LedVerde = 0;                     // Enciende LED Verde para confirmar la comunicación OK con el módem.
+    pc.printf("Modem configurado\n"); // Envia mensaje a la terminal
+  }
+  else
+  {
+    wait(1);
+    goto inicio1; // se hace un reintento de conexion o el sistema no funcionara
+  }
+
+  //Luego se verifica GPS bien conectado (si esta habilitado por dip sw)y recibiendo satelites
+  if (!sin_gps)
+  {
+    pc.printf("SIN GPS\n\r"); //confirma con teminal que no se habilito el gps
+    goto seguir9;             // de inmediato funcionara sin gps
+  }
+  //*****************************************Test para un GPS bien instalado***********************************************
+
+  //******************************************esta bien el GPS*****************************************************************
+  pc.printf("CON GPS\n\r");
+  g = gps.sample();
+  if (g)
+  {
+    LedAzul = 0;
+    pc.printf("GPS--OK\n\r");
+  }
+  else
+  {
+    pc.printf("GPS--Not_OK\n\r");
+  }
+
+// LECTURA MENSAJE ENTRANTE
+seguir9:
+  // Inicia código ciclico leyendo cualquier mensaje SMS entrante
+  while (1)
+  {
+    if (GSM.readable())
+    {
+      readBuffer(buffer, 110);
+      pc.printf("%s\r\n", buffer);
+      for (i = 0; i < 5; i++)
+      {
+        resp[i] = buffer[i];
+      }
+
+      pc.printf("%s\r\n", resp);
+      if (strcmp("$$+CM", resp) == 0)
+      { //COMPARA resp con "+CMTI"
+        pc.printf("Llego MSG\r\n");
+        cleanBuffer(buffer, 10);
+        GSM.printf("AT+CMGL=0\r\n"); // Envío comando para leer mensaje
+        pc.printf("AT+CMGL=0\r\n");
+        //GSM.printf("AT+CMGD=0\r\n"); // Envío comando para borrar el mensaje.
+        readBuffer(buffer, 110);
+        pc.printf("%s\r\n", buffer);
+
+        // LECTURA TELÉFONO EMISOR
+        for (i = 0; i < 10; i++)
+        {
+          tel[i] = buffer[i + 40];
+        }
+        pc.printf("Telefono: %c%c%c%c%c%c%c%c%c%c\r\n", tel[1], tel[0], tel[3], tel[2], tel[5], tel[4], tel[7], tel[6], tel[9], tel[8]);
+
+        // Lectura del tamaño
+        for (i = 0; i < 2; i++)
+        {
+          tam[i] = buffer[i + 68];
+        }
+        pc.printf("%s-\r\n", tam);
+
+        // LECTURA DEL MENSAJE
+        for (i = 0; i < 26; i++)
+        {
+          msg[i] = buffer[i + 70]; // Lee un mensaje de 26 caracteres máximo desde la posición 70 del buffer.
+        }
+        pc.printf("%s-\r\n", msg);
+
+        // DECODIFICACIÓN DEL MENSAJE
+        // Comparar el mensaje
+        deleteSMS(1); // Se borran los mensajes por medio de una función
+        readBuffer(buffer, 110);
+
+        //**************************************************************************
+        //SEGUNDO CASO ACTIVAR SALIDAS                }
+        //.................activar valvula de combustible...............On..on.......................
+        if ((strncmp("4F37", msg, 4) == 0) || (strncmp("6F37", msg, 4) == 0))
+        {
+          recibe_ok();
+          valvula = 1; // Encender valvula.
+        }
+        // ......................................................  off y Off........................
+        if ((strncmp("4FB319", msg, 6) == 0) || (strncmp("6FB319", msg, 6) == 0))
+        {
+          recibe_ok();
+          valvula = 0; // apagar valvula.
+        }
+
+        //............................Envia un Pulso Para Puerta Pulso...D03A7BFE06   pulso.F03A7BFE06..............
+        if ((strncmp("D03A7BFE06", msg, 10) == 0) || (strncmp("F03A7BFE06", msg, 10) == 0))
+        {
+          recibe_ok(); //CONFIRMACION DE RECEPCION REMOTA
+          puerta = 1;  // Encender Puerta.
+          wait(7);     //pulso de 7 segundos
+          puerta = 0;  //apaga puerta
+                  }
+        //*************************************************************************
+
+        // COMPARA resp con "E3F75B4E2EBBC3E4F01C" que es "coordenadas",
+        // o "C3F75B4E2EBBC3E4F01C" que es "Coordenadas".
+        if ((strncmp("E3F75B4E2EBBC3E4F01C", msg, 20) == 0) || (strncmp("C3F75B4E2EBBC3E4F01C", msg, 20) == 0))
+        {
+          recibe_ok();
+          LedVerde = 1; // Encender LED azul.
+          LedAzul = 0;
+          wait(2);
+
+          if (gps.sample())
+          {
+            lo = gps.longitude;
+            la = gps.latitude;
+            pc.printf("\nLongitud entera = %f, Latitud entera = %f\n", lo, la);
+            //wait(0.5);
+
+            //LONGITUD
+            sprintf(clo, "%f", lo);
+            pc.printf("\nLongitud = %s\n", clo);
+            //wait(0.5);
+
+            // LATITUD
+            sprintf(cla, "%f", la);
+            pc.printf("\nLatitud = %s\n", cla);
+            //wait(0.5);
+
+            // Concatenando las cadenas de Latitud y Longitud
+            strcpy(la_lo, cla);
+            strcat(la_lo, ",");
+            strcat(la_lo, clo);
+            pc.printf("\nLatitud, Longitud: %s\n", la_lo);
+
+            // Ahora se juntan las cadenas obtenidas y se agrega el protocolo de
+            // transferencia de hipertextos http
+            strcpy(DE1, http);
+            strcat(DE1, la_lo);
+            pc.printf("\nDireccion: %s\n", DE1);
+            pc.printf("\n");
+            LENIN1 = strlen(DE1);
+
+            //Conversión a octetos.
+            K = 0;
+            C = 0;
+            for (i = 0; i < LENIN1; i++)
+            {
+              DS1[i] = DE1[i + C] >> K | DE1[i + C + 1] << (7 - K);
+              if (DS1[i] == 0x00)
+              {
+                LENOUT1 = i;
+                goto salir1;
+              }
+              K++;
+              if (K == 7)
+              {
+                K = 0;
+                C++;
+              } // se chequea que ya se acabaron los bits en un ciclo de conversion.
+            }
+
+          salir1:
+            for (i = 0; i < LENIN1; i++)
+            {
+              pc.printf("%X", DE1[i]);
+            }
+
+            pc.printf(":\r\n");
+            for (i = 0; i < LENOUT1; i++)
+            {
+              pc.printf("%2X", DS1[i] & 0x000000FF);
+            }
+            pc.printf("\r\nLENOUT GPS: %d, LENIN GPS: %2X\r\n", LENOUT1, LENIN1);
+
+            // Concatenación del mensaje en formato PDU y envío del mismo.
+            ind = 14 + LENOUT1 - 1;
+
+            GSM.printf("AT+CMGS=%d\r\n", ind);
+            pc.printf("AT+CMGS=%d\r\n", ind);
+            pc.printf(relle1);
+            GSM.printf(relle1);
+
+            for (i = 0; i <= 9; i++)
+            {
+              pc.printf("%c", tel[i]);
+              GSM.printf("%c", tel[i]);
+            }
+
+            pc.printf(relle2);
+            GSM.printf(relle2);
+            pc.printf("%2X", LENIN1);
+            GSM.printf("%2X", LENIN1);
+
+            for (i = 0; i < LENOUT1; i++)
+            {
+              pc.printf("%02X", DS1[i] & 0x000000FF);
+              GSM.printf("%02X", DS1[i] & 0x000000FF);
+            }
+            wait(1);
+            GSM.putc((char)0x1A); // Ctrl - Z.
+            GSM.scanf("%s", buf); // Estado del mensaje (Envió o Error).
+            pc.printf(">%s\n", buf);
+            pc.printf("\n");
+          }
+
+          wait(2);
+          LedAzul = 1;
+          LedVerde = 0;
+          GSM.printf("AT+CMGD=0\r\n"); // Borra el mensaje actual (Posición "0").
+                                       //pc.printf("\n%s\n\n", "Borro mensaje");
+        }
+
+        // COMPARA resp con "F6379B1E569701" que es "voltaje", o "F6379B1E569701" que es "Voltaje".
+        if ((strncmp("F6379B1E569701", msg, 14) == 0) || (strncmp("D6379B1E569701", msg, 14) == 0))
+        {
+          //recibe_ok();
+          LedRojo = 0; // Encender LED amarillo.
+          LedVerde = 0;
+          LedAzul = 1;
+          wait(2);
+
+          med = v.read() * 3.3;
+          medi = v.read();
+          pc.printf("\n%f\n", medi);
+
+          cleanBuffer(outmed, 16);
+          if (med < 1)
+          { // Se convierte la Medida a caracter.
+            strcat(outmed, "0");
+            ftoa(med, outmedn, 5);
+            strcat(outmed, outmedn);
+          }
+          else
+          {
+            ftoa(med, outmed, 5);
+          }
+          strcpy(DE2, "Voltaje: ");
+          strcat(DE2, outmed);
+          pc.printf("\n%s\n\n", DE2);
+          LENIN2 = strlen(DE2);
+
+          //Conversión a octetos.
+          K = 0;
+          C = 0;
+          for (i = 0; i < LENIN2; i++)
+          {
+            DS2[i] = DE2[i + C] >> K | DE2[i + C + 1] << (7 - K);
+            if (DS2[i] == 0x00)
+            {
+              LENOUT2 = i;
+              goto salir2;
+            }
+            K++;
+            if (K == 7)
+            {
+              K = 0;
+              C++;
+            } // se chequea que ya se acabaron los bits en un ciclo de conversion.
+          }
+
+        salir2:
+          for (i = 0; i < LENIN2; i++)
+          {
+            pc.printf("%X", DE2[i]);
+          }
+
+          pc.printf(":\r\n");
+          for (i = 0; i < LENOUT2; i++)
+          {
+            pc.printf("%2X", DS2[i] & 0x000000FF);
+          }
+          pc.printf("\r\nLENOUT VOLTAJE: %d, LENIN VOLTAJE: %2X\r\n", LENOUT2, LENIN2);
+
+          // Concatenación del mensaje en formato PDU y envío del mismo.
+          ind = 14 + LENOUT2 - 1;
+
+          GSM.printf("AT+CMGS=%d\r\n", ind);
+          pc.printf("AT+CMGS=%d\r\n", ind);
+          pc.printf(relle1);
+          GSM.printf(relle1);
+
+          for (i = 0; i <= 9; i++)
+          {
+            pc.printf("%c", tel[i]);
+            GSM.printf("%c", tel[i]);
+          }
+
+          pc.printf(relle2);
+          GSM.printf(relle2);
+          pc.printf("%2X", LENIN2);
+          GSM.printf("%2X", LENIN2);
+          /*pc.printf("0F");
+                    GSM.printf("0F");*/
+
+          for (i = 0; i < LENOUT2; i++)
+          {
+            pc.printf("%02X", DS2[i] & 0x000000FF);
+            GSM.printf("%02X", DS2[i] & 0x000000FF);
+          }
+
+          wait(1);
+          GSM.putc((char)0x1A); // Ctrl - Z
+          GSM.scanf("%s", buf); // Estado del mensaje (Envió o Error).
+          pc.printf(">%s\n\n", buf);
+          pc.printf("\n");
+
+          wait(2);
+          LedRojo = 1;
+          LedVerde = 0;
+          GSM.printf("AT+CMGD=0\r\n"); // Borra el mensaje actual (Posición "0").
+                                       //pc.printf("\n%s\n\n", "Borro mensaje");
+        }
+      }
+    }
+  }
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mbed.bld	Fri Aug 30 20:56:39 2019 +0000
@@ -0,0 +1,1 @@
+https://os.mbed.com/users/mbed_official/code/mbed/builds/65be27845400
\ No newline at end of file