Pages: [1]   Go Down
Author Topic: [SOLUCIONADO] Problema para leer un sms con Arduino  (Read 1254 times)
0 Members and 1 Guest are viewing this topic.
0
Offline Offline
Newbie
*
Karma: 0
Posts: 15
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
+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:
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:
void Modem::limpiarBuffer()
{
  while (Serial1.read() >= 0)
   ; // no hacemos nada :-)
}
« Last Edit: December 09, 2012, 05:38:19 pm by kamaxeon » Logged

0
Offline Offline
Newbie
*
Karma: 0
Posts: 15
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
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 ???
Logged

0
Offline Offline
Newbie
*
Karma: 0
Posts: 15
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Se respondo a mí mismo  smiley-confuse

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:
  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();
  }
 
Logged

Spain
Offline Offline
God Member
*****
Karma: 25
Posts: 956
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

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

Pages: [1]   Go Up
Jump to: