Problem mit Seriellen Daten vom GSM-Modul

Programmierung und Hardwaredesign mit Arduino, AVR, PIC und Konsorten.

Moderatoren: MaxZ, ebastler, SeriousD

Benutzeravatar

Thread-Ersteller
Weedmaster13
Beiträge: 80
Registriert: Di 5. Mär 2013, 16:20
Spezialgebiet: Bunker
Schule/Uni/Arbeit: Gymnasium
Wohnort: Bei Hamburg

Problem mit Seriellen Daten vom GSM-Modul

Beitrag von Weedmaster13 »

Moin Moin,

hab derzeit nen massiven Gehirnknoten.

Ich will mit einem Arduino SMS empfangen und auf einem LCD Display den Inhalt ausgeben.
Ich hab jetzt aber schon mit dem korrekten auswerten der Seriellen Daten vom GSM-Modul (TC35) Probleme.
Kann mir da vlt. jemand helfen?

Code sieht bis jetzt so aus:

Code: Alles auswählen

  
  #include <SoftwareSerial.h>
    SoftwareSerial mySerial(10, 11); // RX, TX
    int val = 0;
    long abruf = 0;

    void setup() {
      // Open serial communications and wait for port to open:
      Serial.begin(9600);
      while (!Serial) {
        ; // wait for serial port to connect. Needed for native USB port only
      }
      mySerial.begin(9600);
      pinMode(13, OUTPUT);
      pinMode(4, INPUT);
      digitalWrite(4, LOW);
      pinMode(4, OUTPUT);
      delay(100);
      pinMode(4, INPUT);
      Serial.println("Goodnight moon!");
      delay(5000);
      //mySerial.println("AT");
      delay(1500);
      mySerial.println("AT+CPIN=7021");
      delay(1500);
      //mySerial.println("AT+CMGF=1");
      Serial.println("Ready");
      delay(200);
    }

    void loop() { // run over and over
      if (mySerial.available()) {
        Serial.write(mySerial.read());   
      }
      if (Serial.available()) {
        mySerial.write(Serial.read());
       
      }
       abruf = abruf + 1;
        if (abruf > 1000000){
        readsms();
        abruf=0;   
      }
       
     
      }

    void readsms(){
      mySerial.println("AT+CMGF=1");
      delay(200);
      mySerial.println("AT+CMGR=1");
      delay(200);
      mySerial.println("AT+CMGD=1");
      delay(200); 
      }




Der Teil, den ich brauch wird von zwei "!" oder ":" vorne und hinten gekennzeichnet (jenachdem was besser passt).
Ich hoffe jemand kann helfen :?


Grüße
Amerikanische Bauteile, russische Bauteile - die kommen doch alle aus Taiwan.
Benutzeravatar

Paul
Admin
Beiträge: 3595
Registriert: So 7. Aug 2005, 14:34
Schule/Uni/Arbeit: HW/SW-Entwickler
Wohnort: Braunschweig
Hat sich bedankt: 632 Mal
Danksagung erhalten: 210 Mal
Kontaktdaten:

Re: Problem mit Seriellen Daten vom GSM-Modul

Beitrag von Paul »

Hi,

du solltest deine Frage etwas präziser stellen, damit man dir effektiv helfen kann.
Was genau funktioniert nicht? Welche Stelle im Code ist betroffen? Was genau willst du erreichen?

Gruß,
Paul!
“With great power come great heat sinks.”
paulwilhelm.de -- mosfetkiller.de
Benutzeravatar

Thread-Ersteller
Weedmaster13
Beiträge: 80
Registriert: Di 5. Mär 2013, 16:20
Spezialgebiet: Bunker
Schule/Uni/Arbeit: Gymnasium
Wohnort: Bei Hamburg

Re: Problem mit Seriellen Daten vom GSM-Modul

Beitrag von Weedmaster13 »

Hi,

ok, da hast du wohl recht :|

Jetzt funktionierts aufeinmal nichtmehr

Code: Alles auswählen

AT+CMGR=1

+CMGR: "REC READ","+4917692357082",,
Das ist die Antwort vom Modul. Normalerweise sollte dahinter die Uhrzeit und der Inhalt der SMS stehen.
Diese Antwort (die mal funktionierte) wollte ich irgendwie analysieren und den Inhalt der SMS in einen String packen.
Der Inhalt ist in meinem Fall eben mit ":" gekennzeichnet.

Aber irgendwie scheint der Buffer überzulaufen, obwohl ich ihn schon erhöht hab und verschiedene Einstellung ausprobiert hab.

Ich hoffe zu beidem weiß einer weiter.

Grüße
Amerikanische Bauteile, russische Bauteile - die kommen doch alle aus Taiwan.

Spitzi
Beiträge: 2349
Registriert: Mo 7. Feb 2011, 23:24
Schule/Uni/Arbeit: Student/Elektrotechnik
Wohnort: Aachen
Danksagung erhalten: 3 Mal
Kontaktdaten:

Re: Problem mit Seriellen Daten vom GSM-Modul

Beitrag von Spitzi »

Es tut mir leid, aber irgendwie sehe ich immer noch keine genaue Fehlerbeschreibung, oder irgendwas was uns helfen könnte, dir zur helfen.
1. Wissen wir nicht, welche Teile verbaut sind, und wie sie angeschlossen sind.
Aus dem Quelltext seh ich nur, das du 2 UARTs nutzt, und alles auf einem Arduino läuft.
2. Schreibst du in deiner 2. Nachricht ein Fragment eines Codes, der eigentlich auswertende Code, also der Teil wo irgendwas überläuft ist aber nicht zu sehen.
Benutzeravatar

Thread-Ersteller
Weedmaster13
Beiträge: 80
Registriert: Di 5. Mär 2013, 16:20
Spezialgebiet: Bunker
Schule/Uni/Arbeit: Gymnasium
Wohnort: Bei Hamburg

Re: Problem mit Seriellen Daten vom GSM-Modul

Beitrag von Weedmaster13 »

Sorry und danke für die Geduld.
Ich versuchs jetzt nochmal (und hoffentlich richtig)


Also:
Ich hab einen Arduino Pro Mini vor mir.
Zum kommunizieren mit diesem benutz ich ein USB-TTL Converter.
Vom Converter zum Pro Mini sind RX, TX,5V, Reset und GND verbunden.

Und vom Arduino gehen folgende Kabel zum GSM-Modul.
5V & GND an 5V & GND ( :o )
Am Arduino und am TC35 sind kleine Elkos von mir noch angebracht.
Pin 4 geht zum IGT Pin am Modul. Der Pin muss zum Starten des Moduls kurz auf GND gezogen werden.

Und dann benutz ich auf Pin 10 & 11 eine Software UART um mit dem Modul zu kommunizieren.


Der obere Teil des Codes ist dafür zuständig, dass der Arduino als Relais für das Serielle dient.

Code: Alles auswählen

if (mySerial.available()) {
    Serial.write(mySerial.read());   
  }
  if (Serial.available()) {
    mySerial.write(Serial.read());
Danach ist einfach ein Teil, der nach einer bestimmten Anzahl an Durchläufen des Codes überprüfen soll, ob eine SMS gekommen ist.

Code: Alles auswählen

void readsms(){
  mySerial.println("AT+CMGF=1");   //Stellt das Modul in Textmodus
  delay(1000);
  mySerial.println("AT+CMGR=1");  //Liest die SMS
  delay(1000);
  mySerial.println("AT+CMGD=1");  //Löscht die SMS
  delay(1000);  
  }
Der Arduino führt den Code in seiner Gesamtheit auch ohne Probleme aus, nur wird, wenn er mir per Serial.write die Daten am PC nochmal anzeigen soll, scheinbar nicht alles übertragen.
Bei dem Kommando "AT+CMGR=1" muss als Antwort

Code: Alles auswählen

+CMGR: "REC READ","[HANDYNUMMER]",[DATUM+UHRZEIT],[INHALT DER SMS]
zurückkommen.
Wenn ich ihm den Befehl per Seriellen Terminal per Hand gebe, dann macht er das auch.
Aber sobald der Arduino den Befehl von selber ausführt kommt als Ausgabe/Antwort nur

Code: Alles auswählen

+CMGR: "REC READ","+49--------82",,
Mein Problem ist jetzt eben, dass er das scheinbar nicht vollständig ausliest oder überträgt.
Und dann wenn er es überträgt soll er den Inhalt der SMS in ein string verpacken (was ich auch noch nicht lösen konnte)



Ich hoffe es ist jetzt verständlicher
Grüße
Amerikanische Bauteile, russische Bauteile - die kommen doch alle aus Taiwan.

Spitzi
Beiträge: 2349
Registriert: Mo 7. Feb 2011, 23:24
Schule/Uni/Arbeit: Student/Elektrotechnik
Wohnort: Aachen
Danksagung erhalten: 3 Mal
Kontaktdaten:

Re: Problem mit Seriellen Daten vom GSM-Modul

Beitrag von Spitzi »

Na also, jetzt habe ich das Problem verstanden und kann dir helfen ;) Die Nachfragerei war nicht böse gemeint, nur manchmal ist man als Involvierter "betriebsblind" und denkt, das die Außenstehenden ja alles wissen müssten.

Wenn ich mir den Code so ansehe, fehlt da ja noch der Teil indem du die SMS ausliest, weil du ja nur den Befehl zum auslesen an das GSM Modul schickst.
Oder ist es so gedacht, das der erst die 2 Befehle kriegt (lesen und löschen), und dann erst die Daten in der regulären Schleife ausgelsen werden?
Also das wäre mein erster Lösungsansatz: Was passiert wenn man nicht löscht, sondern einfach nur lesen lässt.

Soviel dazu. Ich hab gerade noch gegooglet, du bist mit deinem Problem nicht alleine: http://stackoverflow.com/questions/2331 ... nd-arduino
Der Lösungsvorschlag auf dein Problem angepasst:

Code: Alles auswählen

void readsms(){
      mySerial.println("AT+CMGF=1");
      delay(200);
      mySerial.println("AT+CMGR=1");
      int count = 5;                       // Number of 100ms intervals before 
                                  
      while(count-- != 0) {                // Loop until count = 0
             delay(100);                        // Delay 100ms
             while (mySerial.available() > 0){  // If there is data, read it and reset
                   Serial.print(mySerial.read());  //Direkt an den PC weiterleiten
                   count = 5;        
             }
        }
      
      mySerial.println("AT+CMGD=1");
      delay(200);
Der Softwareserial des Arduinos hat eine Größe von 64 Zeichen. Mit dem Steuerzeichen die alle schon im Buffer stehen, bist du schon haarscharf an der Kante diese zu überschreiten. Sobald der Buffer Overflow Eintritt lehnt der Arduino die folgende Kommunikation ab. Dies könnte dann die zusammenhängende Kette des SMS-Textes sein, weshalb der auch genau nach dem Komma abbricht.
Zum auslesen in einen String: Das geht mit dem gezeigten Code schon sehr gut. Ein String ist ja nur ein Array von einzelnen Zeichen, mit dem Softwareserial liest man zeichenweise aus.
Die ergänzte Schleife hab ich mal hingeschrieben:

Code: Alles auswählen

       char c;
       char[] smsText = new char[160]; //SMS Größe max. 160 Zeichen (Die guten alten Zeiten)
       int commaCount = 0;
       int charCounter = 0;
       while(count-- != 0) {                // Loop until count = 0
             delay(100);                        // Delay 100ms
             while (mySerial.available() > 0){  // If there is data, read it and reset
                  c = (char)mySerial.read();
                  if(commaCount >= 2) //Drittes Komma erreicht, ab jetzt kommt der SMS Text. //>= weil in der SMS auch kommas stehen können, das erhöht den Zähler
                  {
                       smsText[charCounter++] = c; //Jeder Buchstabe wird fortlaufend in den char[] string geschrieben
                  }
                  if(c == ',') commaCount++; //Bewusst hierdrunter, weil dann das 1. Komma nicht in die SMS kommt
                   Serial.print(c); //Direkt an den PC weiterleiten
                   count = 5;        
             }
        }

Alle Angaben sind natürlich auf Spekulationsbasis und Bugs kannst du mit Insektenspray selbst beseitigen ;)
Benutzeravatar

Thread-Ersteller
Weedmaster13
Beiträge: 80
Registriert: Di 5. Mär 2013, 16:20
Spezialgebiet: Bunker
Schule/Uni/Arbeit: Gymnasium
Wohnort: Bei Hamburg

Re: Problem mit Seriellen Daten vom GSM-Modul

Beitrag von Weedmaster13 »

Musst dich nicht dafür entschuldigen, dass ich einwenig verplant bin ;)

Gibt nur ein Problem, das ich nicht versteh, da ich mich mit Strings nicht wirklich auskenn :s

Code: Alles auswählen

sketch_jan20b.ino: In function 'void readsms()':
sketch_jan20b:79: error: expected unqualified-id before '[' token
sketch_jan20b:88: error: 'smsText' was not declared in this scope
expected unqualified-id before '[' token
wird mir ausgeworfen.
Ich versteh, dass das er mit den Klammern bei dem "char" nicht klarkommt, aber wie müsste ich das umändern?
Geschwungende Klammern kommen ja auch nicht drum, da es ja gleichgesetzt wird, oder?

Grüße
Amerikanische Bauteile, russische Bauteile - die kommen doch alle aus Taiwan.

Spitzi
Beiträge: 2349
Registriert: Mo 7. Feb 2011, 23:24
Schule/Uni/Arbeit: Student/Elektrotechnik
Wohnort: Aachen
Danksagung erhalten: 3 Mal
Kontaktdaten:

Re: Problem mit Seriellen Daten vom GSM-Modul

Beitrag von Spitzi »

Sorry, das war ein Fail meinerseits. Programmiere sonst in C#, und so würde man da ein Array deklarieren. Das tuts aber natürlich nicht in C++ ;)
Ersetze diese Zeile einfach durch

Code: Alles auswählen

char smsText[160];
dann tuts das.
Benutzeravatar

Thread-Ersteller
Weedmaster13
Beiträge: 80
Registriert: Di 5. Mär 2013, 16:20
Spezialgebiet: Bunker
Schule/Uni/Arbeit: Gymnasium
Wohnort: Bei Hamburg

Re: Problem mit Seriellen Daten vom GSM-Modul

Beitrag von Weedmaster13 »

Hallo Spitzi,

Code hat ohne Probleme kompiliert.

Jetzt passiert aber folgendes:

Code: Alles auswählen

+CMTI: "SM",1      //Benachrichtigung, dass eine SMS gekommen ist

65844367777170614913131079751310658443677771826149131310436777718258323482696732857882696568344434435257495554575051535548565034444434495447484947514844495058505658515543485234131010311412630101321310131079751310AT+CMGD=1

OK
Ich kann mir das in keinster Weise erklären, wo der die Zahlen herbekommt.
Das GSM Modul ist auch im Textmodus, daher kann das also eigentlich nicht kommen.
Was läuft denn jetzt falsch?

Grüße
Amerikanische Bauteile, russische Bauteile - die kommen doch alle aus Taiwan.
Benutzeravatar

Thread-Ersteller
Weedmaster13
Beiträge: 80
Registriert: Di 5. Mär 2013, 16:20
Spezialgebiet: Bunker
Schule/Uni/Arbeit: Gymnasium
Wohnort: Bei Hamburg

Re: Problem mit Seriellen Daten vom GSM-Modul

Beitrag von Weedmaster13 »

Hat keiner eine Idee?
Es sind ja auch keine ASCII-Nummern
Weiß jemand weiter D:

Grüße
Amerikanische Bauteile, russische Bauteile - die kommen doch alle aus Taiwan.
Benutzeravatar

Thunderbolt
Beiträge: 2869
Registriert: Fr 7. Apr 2006, 14:05
Spezialgebiet: Physik,Elektronik,Blender
Schule/Uni/Arbeit: M.Sc ET, Hardwareentwickler
Wohnort: 65366 Geisenheim (Hessen)
Hat sich bedankt: 1 Mal
Danksagung erhalten: 70 Mal
Kontaktdaten:

Re: Problem mit Seriellen Daten vom GSM-Modul

Beitrag von Thunderbolt »

mal versucht

Code: Alles auswählen

char smsText[160]= {' '};
oder

Code: Alles auswählen

char smsText[160]= {0};
um das array vorher zu initialisieren?
Benutzeravatar

Thread-Ersteller
Weedmaster13
Beiträge: 80
Registriert: Di 5. Mär 2013, 16:20
Spezialgebiet: Bunker
Schule/Uni/Arbeit: Gymnasium
Wohnort: Bei Hamburg

Re: Problem mit Seriellen Daten vom GSM-Modul

Beitrag von Weedmaster13 »

ich hab jetzt das Array initialisiert und hab den String auch nullterminiert und Code sieht jetzt so aus:

Code: Alles auswählen

void readsms(){
      mySerial.println("AT+CMGF=1");
      delay(500);
      mySerial.println("AT+CMGR=1");
      int count = 5;                       // Number of 100ms intervals before
                                 
      while(count-- != 0) {                // Loop until count = 0
             delay(100);                        // Delay 100ms
             while (mySerial.available() > 0){  // If there is data, read it and reset
                   Serial.print(mySerial.read());  //Direkt an den PC weiterleiten
                   count = 5;       
             }
        }
      char c;
      char smsText[160]; //SMS Größe max. 160 Zeichen 
      smsText[160]= {' '};
      int commaCount = 0;
      int charCounter = 0;
      while(count-- != 0) {                // Loop until count = 0
             delay(100);                        // Delay 100ms
             while (mySerial.available() > 0){  // If there is data, read it and reset
                  c = (char)mySerial.read();
                  if(commaCount >= 2) //Drittes Komma erreicht, ab jetzt kommt der SMS Text. //>= weil in der SMS auch kommas stehen können, das erhöht den Zähler
                  {
                       smsText[charCounter++] = c; //Jeder Buchstabe wird fortlaufend in den char[] string geschrieben
                       //smsText[charCounter]='\0';
                  }
                  if(c == ',') commaCount++; //Bewusst hierdrunter, weil dann das 1. Komma nicht in die SMS kommt
                   smsText[charCounter]='\0';
                   Serial.print(c); //Direkt an den PC weiterleiten
                   count = 5;       
             }
        }  
     
      //mySerial.println("AT+CMGD=1");
      delay(200);
aber

Code: Alles auswählen

Ready
AT+CPIN=7021

OK
658443677771706[NOCHNPAARZAHLEN]079751310658443[ZAHLEN]83234826967328269656834443443525749555[MEHRZAHLEN]5650344444344954474850474852444[HIERAUCHNOCHZAHLEN]903211810111411511612311010010810599104321310131079751310
Das kommt immernoch raus
Also leider das gleiche Problem wie vorher :cry:
Amerikanische Bauteile, russische Bauteile - die kommen doch alle aus Taiwan.
Benutzeravatar

Thread-Ersteller
Weedmaster13
Beiträge: 80
Registriert: Di 5. Mär 2013, 16:20
Spezialgebiet: Bunker
Schule/Uni/Arbeit: Gymnasium
Wohnort: Bei Hamburg

Re: Problem mit Seriellen Daten vom GSM-Modul

Beitrag von Weedmaster13 »

Vielen Dank für deine Hilfe,

so sieht es jetzt aus

Code: Alles auswählen

  void readsms(){
      mySerial.println("AT+CMGF=1");
      delay(500);
      mySerial.println("AT+CMGR=1");
      int count = 5;                       // Number of 100ms intervals before
                                
      while(count-- != 0) {                // Loop until count = 0
             delay(100);                        // Delay 100ms
             while (mySerial.available() > 0){  // If there is data, read it and reset
                   Serial.print(mySerial.read());  //Direkt an den PC weiterleiten
                   count = 5;      
             }
        }
    
      //mySerial.println("AT+CMGD=1");
      delay(200);
      char c;
      char smsText[160]; //SMS Größe max. 160 Zeichen
      smsText[160]= {' '};
      int commaCount = 0;
      int charCounter = 0;
      while(count-- != 0) {                // Loop until count = 0
             delay(100);                        // Delay 100ms
             while (mySerial.available() > 0){  // If there is data, read it and reset
                  c = (char)mySerial.read();
                  if(commaCount >= 2) //Drittes Komma erreicht, ab jetzt kommt der SMS Text. //>= weil in der SMS auch kommas stehen können, das erhöht den Zähler
                  {
                       smsText[charCounter++] = c; //Jeder Buchstabe wird fortlaufend in den char[] string geschrieben
                       smsText[charCounter]='\0';
                  }
                  if(c == ',') commaCount++; //Bewusst hierdrunter, weil dann das 1. Komma nicht in die SMS kommt
                   Serial.write(c); //Direkt an den PC weiterleiten //write statt print
                   count = 5;      
             }
        }

  }
aber ich bekomm trotzdem nur den ASCII-String als antwort
Das ist doch verhext
Was ist denn da noch falsch? D:

Grüße
Amerikanische Bauteile, russische Bauteile - die kommen doch alle aus Taiwan.

Spitzi
Beiträge: 2349
Registriert: Mo 7. Feb 2011, 23:24
Schule/Uni/Arbeit: Student/Elektrotechnik
Wohnort: Aachen
Danksagung erhalten: 3 Mal
Kontaktdaten:

Re: Problem mit Seriellen Daten vom GSM-Modul

Beitrag von Spitzi »

Kannst du uns mal verraten, wo diese Ausgabe denn erscheint? Also ist das direkt an den PC weitergeleitete oder ist das die Ausgabe des Strings? Mir würde es helfen, wenn du mal den kompletten Log der Ausgabe hier rein schreibst, damit ich mich orientieren kann.
Benutzeravatar

Thread-Ersteller
Weedmaster13
Beiträge: 80
Registriert: Di 5. Mär 2013, 16:20
Spezialgebiet: Bunker
Schule/Uni/Arbeit: Gymnasium
Wohnort: Bei Hamburg

Re: Problem mit Seriellen Daten vom GSM-Modul

Beitrag von Weedmaster13 »

Hi,

Die Daten werden einfach im Seriellen Monitor angezeigt
[ externes Bild ]

Grüße
Amerikanische Bauteile, russische Bauteile - die kommen doch alle aus Taiwan.
Antworten