INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 0 Bewertungen - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
komplexer Parser für Anbindung von GSM Modem
08.03.2016, 23:35
Beitrag #1
komplexer Parser für Anbindung von GSM Modem
Hallo zusammen,
ich bin gerade dabei ein GSM/3G/LTE Modul per Arduino anzusprechen um ein paar IoT Demos umzusetzen.
Dazu läuft in der loop ein parser der bytes von der seriellen Schnittstelle einliest und Zeilenunmbrüche erkennt um so die Informationen vom Modul zu verarbeiten.
Das klappt auch soweit ganz gut, zB kann man sehen ob das Modul im Netz registriert ist, die Feldtsärke etc.

Code:
if (mySerial.available()) {
      char c = mySerial.read();
       if (c == '\n') {
        if (command!="\r"){
          parseCommand(command);
        }
        
        command = "";
      }
      else {
        command += c;
      }
  
    }



Mein Problem tritt auf wenn zB eine eingehende SMS erkannt wurde. Dann rufe ich eine Funktion zum Lesen der SMS auf - allerdings muss dann der Parser in der Loop warten und die Zeichen von der Schnittstelle von der SMS Funktion ausgewertet weden können - das Lesen einer SMS gibt zwei Zeilen aus die unterschiedlich ausgewertet werden müssen.

in der Funktion parseCommand() wird bei Erkennen von +CMTI in die Funktion SMS_Read() gesprungen:

Code:
if (part1.equalsIgnoreCase("+CMTI")){
    Serial.println("incoming SMS. reading....  ");
      SMS_Read();
  }

in der SMS_Read-Funktion müsste dann an der parser wie in der loop die Zeilen einlesen und verarbeiten.
(die Antwort vom Modul auf AT+CMGR=1 ist zB wie folgt:

+CMGR: "REC UNREAD","+4917647712345","","16/03/07,16:47:09+04"
Das ist eine SMS
OK
)


Code:
void SMS_Read()
{
  
  String smsstr;

  mySerial.println("AT+CMGR=1\r");
  
      if (mySerial.available()) {
        char x = mySerial.read();
           Serial.print(x);
        if (x == '\n') {

        if (smsstr!="\r"){
        
          //parse start
          
              if (smsstr.equalsIgnoreCase("+CMGR:")){
                String num;
                num=smsstr.substring(smsstr.indexOf(",")+1, smsstr.indexOf("\"\""));
                num=num.substring(0, num.indexOf("\"\""-1));
                Serial.print("SMS from :"); Serial.println("num");;  
              } else
              if (smsstr.equalsIgnoreCase("OK")){
                String num;
                Serial.println("finished");  
              }
              else {
                String num;
                Serial.print("Text: "); Serial.println(smsstr);
                ATCommand("at+cmgd=1");  
              }
          
          //parse end
        }
      
        smsstr = "";
        }
        else {
          smsstr += x;
        }

      }
return;

}

meine Idee war ein Flag incmd zu nutzen welches bei Programmstart auf int incmd=0 gesetzt wird und bei Aufruf des SMS parser auf 1.

In der loop habe ich also
if (incmd!=1){} um den serial parser gelegt, und beim SMS_Read Aufruf
incmd=1;
SMS_Read();
incmd=0;

Leider liest er in der SMS-Funktion die seriellen Zeichen nicht ein. Die Funktion wird aufgerufen, der AT+CMGR=1 Befehl wird gesendet - und die Antwort vom Modem kommt schon wieder aus der loop-Funktion auf Serial.send gespiegelt.

Vielleicht kann mir jemand einen Tipp geben was ich hier noch falsch mache?

besten Dank und sorry für den sehr langen ersten Post hier im Forum Wink

Chris
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
10.03.2016, 15:24 (Dieser Beitrag wurde zuletzt bearbeitet: 10.03.2016 17:16 von iks77.)
Beitrag #2
RE: komplexer Parser für Anbindung von GSM Modem
gnnnn.. kann gar nicht gehen, da meine serial.read funktion in der SMS_Read() gar nicht in eine loop geht... Ich bau das jetzt mal um und poste später mein Ergebnis...

So, das klappt jetzt - durch setzen von int parsing=0;

in der SMS Decoder Schleife wird dann abgefragt

while (parsing == 0) { //bei Ende setze parsing =1}

Nur noch ein Problem. Folgender Code soll nach +CMGR, OK oder sonstigem Text suchen und dementsprechend springen. mit +CMGR klappt es, mit dem Text auch -- aber er landet nie bei OK.

Eingaben:
+CMGR: "REC UNREAD","+4917647712345","","16/03/07,16:47:09+04"
testSMS
OK

Ausgabe vom Programm:

INSIDE SMS PARSER NEW LINE
+CMGR: "REC UNREAD","+4917647712345","","16/03/07,16:47:09+04"
CMGR DECODE
INSIDE SMS PARSER NEW LINE
testSMS
TEXT DECODE
INSIDE SMS PARSER NEW LINE
OK
TEXT DECODE


code:

Code:
void SMS_Read()
{
  
  String smsstr;
  String smspart1;
  String smspart2;
  int parsing=0;

  Serial.println("AT+CMGR=1\r");
  Serial.println("INSIDE SMS PARSER");
  Serial.print("incmd ");Serial.println(incmd);
  
while (parsing == 0) {  
  
      if (Serial.available()) {
        char x = Serial.read();
           Serial.print(x);
        if (x == '\n') {
          Serial.println("INSIDE SMS PARSER NEW LINE");
          
        if (smsstr!="\r"){
          Serial.print("LINE CONTENT: ");Serial.println(smsstr);
          //parse start
          smspart1 = smsstr.substring(0, smsstr.indexOf(":"));
          smspart2 = smsstr.substring(smsstr.indexOf(":") + 1);

              if (smspart1.equalsIgnoreCase("+CMGR")){
                Serial.println("CMGR DECODE");
              }
              else
              if (smspart1.equalsIgnoreCase("OK")){
                Serial.println("OK DECODE");
                parsing = 1;
              }
              
              else {
                String num;
                Serial.println("TEXT DECODE");
              }
          
        }
      
        smsstr = "";
        }
        else {
          smsstr += x;
        }

      }

   }

    Serial.println("INSIDE SMS END");

return;

}
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  Komplexer Kamera Timelaeps Steuerung (Gimbal/Slider Kombination) fknobel 6 823 25.10.2015 14:25
Letzter Beitrag: Klaus(i)

Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste