[Risolto]Sms estrarre il testo dal messaggio ricevuto.

Salve ,ricevo il messaggio correttamente ma non riesco ad estrarre solo il testo ricevuto .

void loop() {
if (Serial2.available()) {

    String buffer = "";
    buffer = Serial2.readString();
    Serial.println(buffer);
    // Serial.println(buffer);
    int LungaRicevo = buffer.length();
    Serial.println(LungaRicevo);
    int Posizione = buffer.indexOf("MESSAGE:");
    String Testo = buffer.substring(Posizione + 8, LungaRicevo);
    Serial.println(Testo);

    if (buffer.indexOf("+CMTI:") != -1) {

      Serial.print("SMS Index No... ");
      int indexno = sms.indexFromSerial(buffer);
      Serial.println(indexno);

      Serial.print("Who send the message?...");
      Serial.println(sms.getSenderNo(indexno));

      Serial.print("Read the message... ");
      Serial.println(sms.readFromSerial(buffer));
    } else {
      Serial.println(buffer);
    }   
  }
}

Questa cosa stampa su monitor ?
Serial.println(buffer);

Stampa questo.

SMS Index No... 30
Who send the message?...+39338
Read the message... FOLDER:INCOMING|STATUS:UNREAD|PHONENO:+393366|DATETIME:21/02/23,16:39:56+04|MESSAGE:Ciao

Quindi Serial.println(Testo); non ti stampa il messaggio ?
Prova a stampare il valore di Posizione

nid69ita:
Quindi Serial.println(Testo); non ti stampa il messaggio ?
Prova a stampare il valore di Posizione

LungaRicevo  =18
Posizione   =-1
Testo   =: "SM",33

SMS Index No... 33
Who send the message?...+39338
Read the message... FOLDER:INCOMING|STATUS:UNREAD|PHONENO:+396|DATETIME:21/02/23,19:11:15+04|MESSAGE:Ora

Posizione -1 vuol dire che non trova la parola
Quindi metti anche quel pezzo di codice in un if (Posizione != -1 )

Ma, in sostanza, il primo consiglio che gli darei è: elimina le variabili "String" convertendole in stringhe C ossia "char array", e poi usa le relative funzioni, ad esempio la strstr() al posto di indexOf()...

@wingamesyun, se non sai come si fa, oltre a studiare un pochino i char array e relative funzioni, possiamo anche darti una mano ma è una cosa che su Arduino "devi" saper fare...:wink:

Perchè dite sempre la stessa cosa che uno non studia :confused:.Io sto usando Arduino Due e come sapete tutti molte librerie non sono compatibili.
L'unico esempio che posso usare come base e questo e mi funziona Purtroppo con la mia poca esperienza non riesco ad estrarre il testo ricevuto.

nid69ita:
Posizione -1 vuol dire che non trova la parola
Quindi metti anche quel pezzo di codice in un if (Posizione != -1 )

int Posizione = buffer.indexOf("MESSAGE:");
if(Posizione != -1)
{ String Testo = buffer.substring(Posizione + 8, LungaRicevo);
  Serial.println(Testo);
}

>wingamesyun: Ma sai, invece di impazzire con le librerie che vanno e che non vanno, io mi studierei BENE, una volta per tutte, le funzioni di <string.h> e poi NON userei alcuna libreria.

Prendi il set di comandi AT del modulo GSM che stai usando, ti studi bene quali sono i comandi e quali le risposte (nella documentazione ufficiale dei moduli SIMCom sono sempre ben descritte) e vai diretto scrivendo e leggendo dalla seriale senza dover usare cose scritte da altri, che fanno mille mila cose inutili e che a te servono probabilmente per il 10/15% … ::slight_smile:

Guglielmo

nid69ita:

int Posizione = buffer.indexOf("MESSAGE:");

if(Posizione != -1)
{ String Testo = buffer.substring(Posizione + 8, LungaRicevo);
 Serial.println(Testo);
}

18
LungaRicevo  =18
Posizione   =-1
Testo   =: "SM",34

SMS Index No... 34
Who send the message?...+3933
Read the message... FOLDER:INCOMING|STATUS:UNREAD|PHONENO:+3933|DATETIME:21/02/24,18:17:41+04|MESSAGE:CONTROLLO

come si vede dalla seriale non entra nel if .

Se ti stampa quello che scrivi, NON hai fatto la modifica che ti ho indicato.
O segui le mie indicazioni oppure non so che dirti.

Non stampa nulla .
GSMsim questa e la libreria la puoi scaricare direttamente dal IDE.

Comunque secondo me stai facendo un casino.
Quando cerchi MESSAGGE: non hai ancora tutto il messaggio, infatti ti dice che hai solo 18 caratteri
Come può trovare quella parola se la frase è lunga 2 Km e quando sei li hai solo 18 caratteri ??

Probabilmente è l'istruzione sms.readFromSerial(buffer) che legge il resto del sms
quindi credo che quella ricerca di MESSAGE: devi metterla dopo quel sms.readFromSerial(buffer)
Vado a naso, non conosco la libreria sms. Hai il link alla libreria ? Posso dargli una occhiata.

nid69ita:
Comunque secondo me stai facendo un casino.

GSMsim questa e la libreria la puoi scaricare direttamente dal IDE.

>wingamesyun: Quando si quota un post, NON è necessario riportarlo (inutilmente) tutto; bastano poche righe per far capire di cosa si parla ed a cosa ci si riferisce, inoltre, se si risponde al post immediatamente precedente, normalmente NON è necessario alcun "quote" dato che è sottinteso. :slight_smile:

Gli utenti da device "mobile" (piccoli schermi) ringrazieranno per la cortesia :wink:

Guglielmo

P.S.: Ho troncato io il "quote" del tuo post :wink: ... per il futuro, cortesemente, ricordatene :slight_smile:

Mi pare hai copiato e poi modificato l'esempio sms della libreria.
Prova a rimettere dentro il contatore num (dichiara int num=0; ad inizio del programma)
e commenta o togli per ora TUTTO il pezzo dentro la loop() che cerca "+CMTI:"

void loop()
{ 
  if(Serial2.available()) 
  { num=num+1;
    String buffer="";
    buffer=Serial2.readString();
    Serial.print(num); Serial.print(". ");
    Serial.print(buffer.length()); Serial.print(" = ");
    Serial.println(buffer);
  }
}

E poi dicci cosa stampa

nid69ita:
Comunque secondo me stai facendo un casino.

Concordo con @nid69ita.
Con l’istruzione

if (Serial2.available()) {.....}

dai per scontato che tutta la stringa ti arrivi in quel blocco di parentesi e probabilmente non è cosi.
readString() legge tutti i byte che ci sono sulla seriale fino a quando non interviene un timeout, ma magari a te mancano ancora pezzi di testo.
Il testo inviato dal modulo GSM ce l’ha un terminatore di stringa tipo “new line” o “carriage return”?

Buona sera devo rinviare a domani mattina le prove perché il pc non va più. Grazie a domani
Buona serata.

Salve a tutti ,con il loop modificato :

1. 105 = 
*PSNWID: "222","88", "WIND1. 18 = 
+CMTI: "SM",36