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
Mega & SIM800L - Rufnummer Empfänger von String zu Char
30.04.2020, 23:05
Beitrag #1
Mega & SIM800L - Rufnummer Empfänger von String zu Char
Guten Abend,

ich möchte eine Steuerplatine (Schalten mehrere Aus- und Eingänge) mit einem SIM800L Modul erweitern und die Ausgänge ebenfalls per SMS schalten können. Weiterhin sollen auch Schaltvorgänge per SMS "gemeldet" werden.

Um die Funktionen des Moduls zu testen bin ich schon seit Tagen an folgendem Sketch dran.
Es funktioniert soweit:
  • Senden von SMS
  • Empfangen von SMS
  • Auswerten der Nachricht (String)
  • Auswerten der Rufnummer des Senders (String)

Was ich jedoch nicht hinbekomme:
Die Rufnummer einer empfangen SMS kann ich in dem String extrahieren, aber ich schaffe es nicht diese in ein char Array umzuwandeln, damit ich dieser Nummer antworten kann.
Das wird von dem Senden Befehl als char benötigt.


Code:
#include <GSMSim.h>
#include <SoftwareSerial.h>

#define RX 11
#define TX 12
#define RESET 2
#define BAUD 9600

const int testeingang = 5;
bool Status;

char* number = "+491XXXXXXXXXXXXXX";
char* message ;


String Rufnummer;

bool Status_neu = false;
bool Status_alt = true;

String textMessage;


GSMSim gsm(RX, TX);


void setup() {

  pinMode(testeingang, INPUT_PULLUP);

  // put your setup code here, to run once:
  Serial.begin(9600);

  Serial.println("GSMSim Library - SMS Example");
  Serial.println("");
  delay(1000);

  gsm.start(BAUD); // baud default 9600
  //gsm.start(BAUD);

  Serial.println("Changing to text mode.");
  gsm.smsTextMode(true); // TEXT or PDU mode. TEXT is readable :)
  gsm.print("AT+CNMI=2,2,0,0,0");
  delay(100);

  message = "Setup gestartet";

  Serial.println("SMS Setup gestartet");
  Serial.println(gsm.smsSend(number, message));
  delay(2000);

}



void loop() {


  if (gsm.available() > 0) {
    textMessage = gsm.readString();
    Serial.println("SMS empfangen");
    Serial.println(textMessage);


    delay(30);
    gsm.smsDeleteAllRead();
  }



  if (textMessage.indexOf("TEL 1") >= 0) {
    Serial.println("Rufnummer 1:");


  }


  Status = digitalRead(testeingang);
  Serial.print("Status: ");
  Serial.print(Status);
  Serial.println();

  delay(1000);


  if ((digitalRead(testeingang) == LOW)) {

    Serial.println("Schalter an");
    Status_neu = true;
    delay(1000);
  }
  else if ((digitalRead(testeingang) == HIGH)) {
    Serial.println("Schalter aus");
    Status_neu = false;
    delay(1000);

  }

  if ((Status_neu != Status_alt) && (digitalRead(testeingang) == LOW)) {
    Status_alt = Status_neu;
    Serial.println("SMS Schalter an");
    message = "Schalter an"; // message lenght must be <= 160. Only english characters.
    //Serial.println(gsm.smsSend(number, message));
  }
  else if ((Status_neu != Status_alt) && (digitalRead(testeingang) == HIGH)) {
    Status_alt = Status_neu;
    Serial.println("SMS Schalter aus");
    message = "Schalter aus"; // message lenght must be <= 160. Only english characters.
    //Serial.println(gsm.smsSend(number, message));
  }

  if (textMessage != "")
  {
    Serial.println("String nochmal:");
    Serial.println(textMessage);
    //Rufnummer = textMessage.substring(8);
    int temp1 = textMessage.indexOf("+");
    int temp2 = textMessage.indexOf(",") - 1;
    Rufnummer = textMessage.substring(9, temp2);
    Serial.println("Rufnummer:");
    Serial.println(Rufnummer);
    textMessage = "";
  }





}

Folgende Library benutze ich für das SIM800L:
https://github.com/erdemarslan/GSMSim

Gibt es auch eine Möglichkeit, dass man die Funktionen (SMS senden / empfangen) auslagert und im Code aufruft. Ansonsten wird der gesamte Code später sehr unübersichtlich.Dodgy

Ich hoffe es war verständlich?
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
01.05.2020, 09:06
Beitrag #2
RE: Mega & SIM800L - Rufnummer Empfänger von String zu Char
Warum soll das Auslagern in eine Funktion nicht möglich sein?

Warum liest Du die SMS nicht gleich in ein char-Array ein? Infos hier.

Zur Not kannst Du auch message.c_str() nutzen.
Wirf mal einen Blick in die oben im Foru verlinkte Referenz für weiterführend Infos.

Gruß Tommy

"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
01.05.2020, 10:00
Beitrag #3
RE: Mega & SIM800L - Rufnummer Empfänger von String zu Char
(30.04.2020 23:05)kiximek schrieb:  .....
Gibt es auch eine Möglichkeit, dass man die Funktionen (SMS senden / empfangen) auslagert und im Code aufruft. Ansonsten wird der gesamte Code später sehr unübersichtlich.

Klar gibt es die, z.B.

Code:
// aus deiner loop:
sendSMS();
recvSMS();

// die Fuinktionen
void sendSMS(void){
// dein Code zum Senden der SMS
}

void recvSMS(void){
// dein Code zum Empfangen der SMS
}

Gruß Dieter

I2C = weniger ist mehr: weniger Kabel, mehr Probleme. Cool
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
01.05.2020, 11:06
Beitrag #4
RE: Mega & SIM800L - Rufnummer Empfänger von String zu Char
(01.05.2020 09:06)Tommy56 schrieb:  Warum soll das Auslagern in eine Funktion nicht möglich sein?

Warum liest Du die SMS nicht gleich in ein char-Array ein? Infos hier.

Zur Not kannst Du auch message.c_str() nutzen.
Wirf mal einen Blick in die oben im Foru verlinkte Referenz für weiterführend Infos.

Gruß Tommy

Hallo Tommy,

da das Hauptprogramm auch die Strings mit index() ausliest um die einzelnen Funktionen zu schalten, würde ich das beibehalten.
Ich denke, dass geht auch elganter, übersteigt aber mein Können.

Ich habe jetzt folgendes probiert:
Code:
int temp1 = textMessage.indexOf("+");
    int temp2 = textMessage.indexOf(",") - 1;
    Rufnummer = textMessage.substring(9, temp2);
    Serial.println("Rufnummer:");
    Serial.println(Rufnummer);
    char Tel_Antwort = Rufnummer.c_str();
    Serial.println("Rufnummer CHAR:");
    Serial.println(Tel_Antwort);

Zuerst wird aus den empfangenen Daten der SMS die Rufnummer ausgelsenen.
Dann erhalte ich das Format +49xxxxxx.

Wenn ich das jetzt in das char Tel_Antwort umwandel und ausgebe, kommt nur ein Symbol und sonst nichts. Meist ein Quadrat.
Was mache ich falsch?
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
01.05.2020, 11:20
Beitrag #5
RE: Mega & SIM800L - Rufnummer Empfänger von String zu Char
Du solltest die Informationen, die ich verlinkt habe, auch lesen. Darin steht die Antwort auf Deine Frage. Tel_Antwort ist nur ein Zeichen.

Gruß Tommy

"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
01.05.2020, 13:59
Beitrag #6
RE: Mega & SIM800L - Rufnummer Empfänger von String zu Char
Und evtl. auch mal alle Antworten lesen.

Gruß Dieter

I2C = weniger ist mehr: weniger Kabel, mehr Probleme. Cool
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
12.05.2020, 07:02
Beitrag #7
RE: Mega & SIM800L - Rufnummer Empfänger von String zu Char
Hallo,
es funktioniet jetzt.
Danke.

@Thommy:
Ich habe deine Seite mehrmals gelsen und muss sagen, dass ich die erst wirklich nach 5mal Lesen verstanden habe. Wenn man es aber einmal raus hat, TOP.
Für Einsteiger ins Programmieren m.M. nach schwer zu schwerstehen.
Und in meinem Fall hab ich das zu spät gesehen und mir schon andere Sachen durch Beispiele angeeignet.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  3,5" TFT-Touch mit microSD am MEGA Heiko67 9 388 17.02.2021 20:45
Letzter Beitrag: Heiko67
  Sim800L SleepMode Intelmuh 8 351 13.02.2021 17:20
Letzter Beitrag: hotsystems
  char return Werte sind komplett falsch flowmotion 8 453 12.02.2021 22:27
Letzter Beitrag: Tommy56
  Sim800L warten bis Modul im Netz eingewählt ist Intelmuh 5 331 10.02.2021 17:49
Letzter Beitrag: hotsystems
  Template Datentype mit decltype prüfen - error: cannot convert 'bool' to 'char*' flowmotion 2 238 09.02.2021 18:57
Letzter Beitrag: flowmotion
  const char zu int Konvertierung Problem Lumplux 1 177 02.02.2021 10:26
Letzter Beitrag: Lumplux
Sad nrf24L01: ein Sender mehrere Empfänger louard 6 452 11.01.2021 22:25
Letzter Beitrag: louard
  Arduino Mega 2560 Hai47 2 337 08.01.2021 18:29
Letzter Beitrag: AnjinSan
  RFID 125kHz am MEGA 2560 Alexander307 16 741 29.12.2020 22:19
Letzter Beitrag: hotsystems
  MEGA 2560 und DI_output 21,0,1 Christian_Moba-Arduino 4 354 24.12.2020 15:23
Letzter Beitrag: hotsystems

Gehe zu:


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