Go Down

Topic: Empfangen von Daten des SIM808 Moduls Puffer Überlauf (Read 142 times) previous topic - next topic

bilabo

Hallo,

ich habe Probleme beim Empfangen von Daten des SIM808 Moduls.

Wenn ich zuviel Daten von websites abfrage kommen am Ende nicht mehr alle Daten durch.

Meine Funktion momentan sieht folgendermaßen aus:
Code: [Select]

void sendRead(String command, const int timeout){
        char c;
        String response1 = "";   
        sim.println(command);
        long int time = millis();
        int i = 0; 
         
        while( (time+timeout) > millis()){
          while(sim.available() > 0){   
            c = sim.read();
           
               response1+=c;
           }
        }
        Serial.print(response1);
    }


Das Problem ist vermutlich
String response1 = ""; welcher irgendwann voll ist und überläuft.

Was ich nun versuche ist folgendes:

Code: [Select]
#include <SoftwareSerial.h>

SoftwareSerial sim(2, 3); // RX, TX
const byte numChars = 256;
char receivedChars[numChars];
char end_c[1];

void setup()
{
  end_c[0]=0x1a;
  sim.begin(9600);                                                   
  Serial.begin(9600);                                             
  getData("AT+CCID",1000);
   
}

void loop()
{
 
}

void getData(String command,int timeout){
        char c;
        int ndx = 0;
        long int time = millis();
        sim.println(command);
        while( (time+timeout) > millis()){
          while(sim.available() > 0){   
            c = sim.read();
            receivedChars[ndx] = c;
            ndx++;
        }
    }
    Serial.println(receivedChars);
}


Hier schreibe ich jedes char welches ich empfange nach receivedChars[].
Beim zweiten Aufruf fange ich wieder beim receivedChars[0] an und überschreibe die alten Daten.
Somit hätte ich keinen überlauf mehr.

Leider hört mein Code nach 15 chars auf.

Kann mir hier bitte jemand weiterhelfen. Vielen Dank schonmal

Schönen Gruß

Bill

combie

Quote
while( (time+timeout) > millis())
Das bekommst du nicht in den Griff!

eher so:
Code: [Select]
unsigned long time = millis();
sim.println(command);
while(millis()-time < timeout){
Schreie nach Besserem, bis du es auch erhältst.
Das noch Bessere verabschiedet sich rechtzeitig vor deinem Lärm.

Quelle: Martin Gerhard Reisenberg

bilabo

Hallo,

danke für die Antwort.

Ich bekomme leider immer noch die selben 15 chars

Hat sich ja auch nicht viel geändert wenn ich das richtig sehe.

Schönen Gruß

Bill

combie

Hat sich ja auch nicht viel geändert wenn ich das richtig sehe.
Naja...
Immerhin versagt es nicht nach jeweils ca 25 Tagen.
Schreie nach Besserem, bis du es auch erhältst.
Das noch Bessere verabschiedet sich rechtzeitig vor deinem Lärm.

Quelle: Martin Gerhard Reisenberg

uk1408

hallo,

so sieht meine Abfrage des SIM-Ports aus. nZeit ist die time-Out-Zeit in mSek.,term ist die erwartete ANtwort vom SIM, also z.B. ok oder auch mal ERROR oder so. GSM_Serial ist der Port vom SIM.
Vielleicht kannst damit was anfangen:
Code: [Select]

// --------------------------------------------------------------------
// aus   http://miliohm.com/sim800l-arduino-tutorial/

bool LeseGSM(int nZeit, String term)                        // Serielle Schnittstelle lesen und leeren
{
  int  timeout = 0;
  String sBuffer = "leer";

  /* in der Schleife ist ein delay(10) für 10 mSek. Bei nZeit von z.B 1000
     dauert die while-Schleife dann max 1000 * 10 mSek. Die Variable nZeit wird daher
     durch 10 geteilt, dann entspricht der übergebene Wert der Dauer in milliSekunden.
  */

  delay(100);                                               // damit Schnittstelle bereit ist
  while  (!GSM_Serial.available() && timeout < nZeit / 10  )  // Schnittstelle noch nichts zu holen
  { //                                                           und noch nicht Timeout
    delay(10);                                              // 10 mSek.
    timeout++;                                              // Timeout hochzählen
  }
  if (GSM_Serial.available())                               // wenn was von der Schnittstelle kommt
  {
    sBuffer = GSM_Serial.readString();                      // Schnittstelle lesen
    sBuffer.toCharArray(Buffer, sBuffer.length() + 1);      // und in globales CHR-Array Buffer kopieren
    if (strstr(Buffer, term.c_str()) != NULL)               // gesuchte(s) Zeichen drin
    {
      return (true);                                        // ok
    }
  }
  return (false);
}
// --------------------------------------------------------------------


Go Up