Go Down

Topic: [SOLUCIONADO] Problema para leer un sms con Arduino (Read 1 time) previous topic - next topic

kamaxeon

Dec 08, 2012, 01:11 pm Last Edit: Dec 09, 2012, 11:38 pm by kamaxeon Reason: 1
Buenos días,

Expongo mi problema para ver si alguien me puede ayudar. Tengo un modem conectado a un Arduino Mega, si uso el ejemplo que viene con el IDE "MultiSerialMega" me funciona sin problemas. Veo como llega un sms y cuando pido leerlo con "AT+CMGR=1" lo veo sin problemas.

Code: [Select]

+CMTI: "SM",1


+CMGR: "REC UNREAD","+34XXXXXXXXX,,"12/12/08,12:43:41+04"
Mensaje de pruebas

OK



El problema viene cuando quiero capturarlo en un variable todo el mensaje, sólo soy capaz de leer los primeros 64 bytes, y nada del resto, es decir, obtengo la cabecera del mensaje y sólo los tres primero caracteres del sms (+CMGR: "REC UNREAD","+34XXXXXXXXX,,"12/12/08,12:43:41+04"Men), ¿ alguien tiene alguna idea ?

La función que uso es esta.

Code: [Select]

void Modem::obtenerTextoSms()
{
 // Esta funcion recoge el texto del sms  
 String texto;
 int a = 0;
 // Le pedimos el sms
 limpiarBuffer();
 delay(1000);
 Serial1.println("AT+CMGR=1");
 delay(5000);
 Serial.println("Numero de caracteres sin leer: " + Serial1.available());
 while (Serial1.available() > 0)
 {
   char aux = (char)Serial1.read();
   texto += aux;
   Serial.println(aux);
   a ++;
 }
 Serial.println(a);
 this->textoSms = texto.substring(texto.length()-3, texto.length());
   
}


P.D.: En este ejemplo Serial1 es el modem, la función limpiarBuffer() lo único que hace es emular a Serial1.flush() que ya no está disponible

Code: [Select]

void Modem::limpiarBuffer()
{
 while (Serial1.read() >= 0)
  ; // no hacemos nada :-)
}

kamaxeon

He estado mirando el tamaño del buffer del Serial1 y es de 64 bytes, con lo que tiene pinta que descarta el resto, por eso le he quitado el delay para no perder nada, pero aún así continuo con el mismo problema.

Hay alguna forma estándar de cambiar el tamaño del buffer e incrementarlo por ejemplo a 128 bytes.

Actualmente la función es esta.

Code: [Select]

void Modem::obtenerTextoSms()
{
  // Esta funcion recoge el texto del sms   
  String texto;
  int a = 0;
  // Le pedimos el sms
  limpiarBuffer();
  delay(1000);
  Serial1.println("AT+CMGR=1");
  Serial.println("Numero de caracteres sin leer: " + Serial1.available());
  while (Serial1.available() > 0)
  {
    char aux = (char)Serial1.read();
    texto += aux;
    Serial.println(aux);
    a ++;
  }
  Serial.println(a);
  this->textoSms = texto.substring(texto.length()-3, texto.length());
   
}


Alguna idea ???

kamaxeon

Se respondo a mí mismo  :~

El fallo que tenía es que al llegar a los 64 bytes descartaba el resto y lo que estaba haciendo al hacer el delay era llegar el buffer y perder el resto. Para solucionarlo lo que he tenido que hacer es que durante un tiempo prudencial (500 ms) esté leyendo el serial sin parar para evitar el desborde del buffer. El código que me ha funcionado es este:

Code: [Select]

  String texto;
  unsigned long millisantes = millis();
  unsigned long millisdespues = millisantes;
 
  // Estoy 500 ms, definidos en TEM, recorriendo el bucle para evitar el desborde
  // del buffer de 64 bytes, en ese tiempo nos ha devuelto la respuesta
  // del comando AT
  while ( millisdespues - millisantes < TEM)
  {
    while (Serial1.available() > 0)
    {
      char aux = (char)Serial1.read();
      texto += aux;
    }
    millisdespues = millis();
  }
 


Heke

No tengo muy claro que sea eso...

Me suena mas a que llenabas el buffer serie antes de que pudiera sacar los datos.

Yo hubiera puesto un delay muy pequeño dentro del "Serial available()"

Algo asi: delayMicroseconds(50);  o incluso 100...

No te lo puedo asegurar al 100% pero me suena mas a eso...

Un saludo.
CUIDADO !! MIS POST NO SON APTOS PARA MENORES. SI ERES MENOR DE 14 AÑOS DEBES DE LEERLOS ACOMPAÑADO DE UN ADULTO

Go Up