[HELP] Comandi AT per modem e cercare stringa utile su SMS in arrivo

Dunque... ogni tanto passo a trovare i miei amici Softweristi, visto che sono una capra...

Il problema odierno è questo. Telecontrollo con Modem Siemens TC35 + un Arduino NANO.

Dopo un pò di prove, con in mano il manuale dei comandi AT, sono riuscito a far spedire messaggi al coso, quindi la trasmissione è OK.

Il problema è in ricezione.

Mi arriva l'SMS, e qua ci siamo, ma la stringa che esce fuori dalla seriale del modem è comprensiva

di elementi che sono superflui, non mi interessano:

+CMT: " 393 Sg&'_S IRS 2/13,23:27:58+04" ACCESO

Questa qua sopra è una stringa in arrivo. A me, ovviamente, serve solo la stringa ACCESO (o SPENTO) per poi fare un IF o un CASE dove eseguo due semplici rami diversi, dove ovviamente da una parte accendo un pin, e con l'altro comando, lo spengo.

La domanda è: come faccio ad isolare solo il testo dell'SMS da tutto quel bordello di dati?

Si cerca nella stringa se c'è ACCESO, o SPENTO (non esistono altri comandi) oppure si va ad eliminazione del superfluo sovrascrivendolo con degli null? (giusto per buttare giù due idee...)

Thanks :grin:

Boh, io farei il parser del testo proprio alla ricerca di ACCESO o SPENTO. Meno dispendioso che mettersi a spulciare tutta la stringa levando le Acca, le Pi, le Virgole finché non resta quel che mi interessa. Facendo alla rovescia, ossia cercando subito quel che mi interessa, faccio prima

Non fare il tirchio e dammi qualche linea di codice! >:(

Grassie! :grin:

non ti va' bene il serial,find()

http://arduino.cc/en/Serial/Find

Ok, grazie! Ho usato il Serial.Find().

Però c’è una gabola…

Ho usato la seriale software, così ho libera quella hardware per il debug.

Quando spedisco “ACCESO”, il LED si accende, e qua tutto OK.

Però quando vado a spegnerlo con “SPENTO”, oramai il flusso seriale è passato e la funzione non trovando niente, non funziona.

Devo usare qualche maniera che alla prima botta cerco la stringa ACCESO ed anche quella SPENTO, altrimenti la seconda stringa la perdo.

Avete qualche idea?

Codice:

if(gsmSerial.available() >0){
      Serial.println("SMS in arrivo...");
      gsmSerial.setTimeout(500);
      boolean ACCESOfound = gsmSerial.find("ACCESO");    
      if(ACCESOfound == true) {digitalWrite(13, HIGH); Serial.println("ACCESO");}
      else{
       gsmSerial.setTimeout(500);
        boolean SPENTOfound = gsmSerial.find("SPENTO");    
         if(SPENTOfound == true) {digitalWrite(13, LOW); Serial.println("SPENTO");} 
         }
     }

BaBBuino: Però quando vado a spegnerlo con "SPENTO", oramai il flusso seriale è passato e la funzione non trovando niente, non funziona. Devo usare qualche maniera che alla prima botta cerco la stringa ACCESO ed anche quella SPENTO, altrimenti la seconda stringa la perdo.

Scusa, ma io mica ho capito. Non sono due "momenti" diversi ? Non ti arrivano 2 sms diversi ?

Si, due momenti diversi, ma se leggi il codice c'è PRIMA un Serial.find che cerca la parola ACCESO e DOPO un altro Serial.Find che cerca la parola SPENTO, questo perchè il software non sa che genere (dei due tipi) di messaggio è arrivato, quindi deve cercare quale dei due è contenuto nella stringa completa.

Ci vuole una ricerca delle due stringhe ACCESO e SPENTO in una unica istruzione. Il Serial.find funziona solo alla prima botta, ovvero al primo flusso e con la prima istruzione. Se metto un secondo Serial.find, oramai il flusso lo ha intercettato il primo, ed il secondo Serial.find non si becca più niente da analizzare.

Mi sa che devo buttare tutta la stringa in arrivo in un array e poi andare a cercare con calma se dentro c'è da qualche parte ACCESO o SPENTO.

Qualche idea?

Se può aiutare, la stringa del messaggio SMS che serve, è sempre alla fine ed in questo formato:

+CMT: " 393 Sg&'_S IRS 2/13,23:27:58+04" ACCESO

Ah, ora ho capito. Si anche secondo me devi scaricare i dati in buffer e poi analizzarla. Esiste la strstr() che cerca una stringa in un buffer http://www.nongnu.org/avr-libc/user-manual/group__avr__string.html#ga6a441da9211eb85881d99c60b1003552

Vado subito a vedere...

Grazie!

Grazie ai Befani softwareschi del Fourm Arduino, ho Risolto! Thanks! :grin:

Allora... Ho usato due funzioni Ci-esche, quella suggerita da nid (strstr) ed una seconda funzione per comparare due stringhe (strcmp).

In pratica ricerco ed estraggo dentro il messaggio SMS (buttato dentro un array) la stringa ACCESO (sempre se c'è) e poi la confronto appunto con la stringa "ACCESO".

Se c'è match, allora sono a posto, e procedo con qualche IF.

Ovviamente faccio lo stesso per la stringa SPENTO

uint8_t Cerca_ACCESO()
{
  char * ptr;
  ptr = strstr (incoming_modem_data,"ACCESO");
  SI = strncmp(ptr,"ACCESO",6);  // restituisce 0 se c'è riscontro
  if(SI == 0) {SI = 2; Serial.println("MATCH ACCESO!");}
  else {SI != 0; Serial.println("NO MATCH ACCESO!");}  
  return SI; // Esce 2 se ho trovato ACCESO, esce 1 se NON l'ho trovato
} 

uint8_t Cerca_SPENTO()
{
  char * ptr;
  ptr = strstr (incoming_modem_data,"SPENTO");
  SI = strncmp(ptr,"SPENTO",6); // restituisce 0 se c'è riscontro
  if(SI == 0) {SI = 3; Serial.println("MATCH SPENTO!");}
  else {SI != 0; Serial.println("NO MATCH SPENTO!");} 
  return SI; // Esce 3 se ho trovato ACCESO, esce 1 se NON l'ho trovato
}

Scaricati tutta la seriale in un oggetto String e poi con il metodo indexOf() cerchi nella stringa se è presente acceso, spento o sono presenti entrambi.

OPS: scritto mentre postavi

@Leo che suggerisce di usare String ? :fearful: Nooo vade retro Satana :smiling_imp: :grin: :grin:

Ma quale comando usi per leggere l'SMS? AT+CMGR o AT+CMGL? Secondo quanto scritto qui http://www.developershome.com/sms/readSmsByAtCommands.asp ti dovrebbe restituire qualcosa del genere

+CMGR: "REC READ","+85291234567",,"07/02/18,00:12:05+32"
Hello, welcome to our SMS tutorial

Per cui ti basterebbe cercare il sesto " quello che viene dopo è il testo

nid69ita: @Leo che suggerisce di usare String ? :fearful: Nooo vade retro Satana :smiling_imp: :grin: :grin:

Guarda che ultimamente sull'oggetto String hanno fatto un bel lavoro. Non è buggato come lo era tempo fa. Se uno sa come usarlo (ad esempio, dimensionandolo per evitare frammentazione) non è quel "satana" che era prima