Ich lerne noch und versuche das GSM Modul sim800L zu verstehen.
Soweit ok Die ersten Schritte und Demos funktionieren gut.
Nun versuche ich eine SMS mit nachfolgendem Sketch auszulesen.
Das funktioniert zwar, aber wie bekomme ich den Inhalt der SMS
in einem String / eine Textvariable.
Ich habe stundenlang versucht und komme nicht weiter kommen.
#include <SoftwareSerial.h>
//Create software serial object to communicate with SIM800L
SoftwareSerial mySerial(3, 2); //SIM800L Tx & Rx is connected to Arduino #3 & #2
void setup()
{
//Begin serial communication with Arduino and Arduino IDE (Serial Monitor)
Serial.begin(9600);
//Begin serial communication with Arduino and SIM800L
mySerial.begin(9600);
Serial.println("Initializing...");
delay(1000);
mySerial.println("AT"); //Once the handshake test is successful, it will back to OK
updateSerial();
mySerial.println("AT+CMGF=1"); // Configuring TEXT mode
updateSerial();
mySerial.println("AT+CNMI=1,2,0,0,0"); // Decides how newly arrived SMS messages should be handled
updateSerial();
}
void loop()
{
updateSerial();
}
void updateSerial()
{
delay(500);
while (Serial.available())
{
mySerial.write(Serial.read());//Forward what Serial received to Software Serial Port
}
while(mySerial.available())
{
Serial.write(mySerial.read());//Forward what Software Serial received to Serial Port
}
}
Setze Deinen Code bitte in Codetags (</>-Button oben links im Forumseditor oder [code] davor und [/code] dahinter ohne *).
So ist er auch auf portablen Geräten lesbar. Das kannst Du auch noch nachträglich ändern.
DO3GE:
Nun versuche ich eine SMS mit nachfolgendem Sketch auszulesen.
Das funktioniert zwar, aber wie bekomme ich den Inhalt der SMS
in einem String / eine Textvariable.
Was für eine Hardware(UNO/NANO?) nimmst du? Und was bzw. wie funktioniert es?
Ich benutze einen UNO.
Eigentlich funktioniert der Sketch oben wunderbar.
Die eingehende SMS wird erkannt, gelesen und auf den seriellen Monitor ausgegeben.
Und da beginnt mein Problem. Ich hab da noch ein Verständnisproblem.
Ich will nun die SMS nicht auf den Monitor, sondern in eine Variable damit ich sie
weiter verarbeiten kann.
Dann schau Dir mal an, wie man die Zeichen einer Seriellen Schnittstelle in ein char-Array einliest, z.B. hier.
Du solltest die SMS mit Zeilenvorschub abschließen.
wie die Vorredner schreiben: Serielle Schnittstelle in einen char-Buffer lesen und dann weiter bearbeiten.
Ich habe mal was aus einem anderen Projekt rausgenommen.
#include <SoftwareSerial.h>
char Buffer[1000]; // Ergebnis vom GSM-Port
String sOK = "OK"; // Default für GSM_Antwort
//Create software serial object to communicate with SIM800L
SoftwareSerial GSM_Serial(3, 2); //SIM800L Tx & Rx is connected to Arduino #3 & #2
bool LeseGSM(int nZeit = 1000, String term = sOK); // Serielle GSM-Schnittstelle lesen und leeren
void setup()
{
//Begin serial communication with Arduino and Arduino IDE (Serial Monitor)
Serial.begin(115200);
//Begin serial communication with Arduino and SIM800L
GSM_Serial.begin(19200);
Serial.println("Initializing...");
delay(1000);
GSM_Serial.println("AT"); //Once the handshake test is successful, it will back to OK
LeseGSM(5000);
GSM_Serial.println("AT+CMGF=1"); // Configuring TEXT mode
LeseGSM(5000, "");
GSM_Serial.println("AT+CNMI=1,2,0,0,0"); // Decides how newly arrived SMS messages should be handled
LeseGSM(5000, "");
// um zu sehen was im Netz los ist...
GSM_Serial.println("AT + CSQ"); // RSSI
LeseGSM(5000, "");
GSM_Serial.println("AT + COPS ?"); // Provider
LeseGSM(5000, "");
}
void loop()
{
if (LeseGSM(5000, "CMT"))
{
Serial.println(String(Buffer));
}
}
// nach http://miliohm.com/sim800l-arduino-tutorial/
bool LeseGSM(int nZeit, String term = sOK) // Serielle Schnittstelle lesen und leeren
{ // nZeit ist Timeout, term wird gesucht
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()); // und in globales CHR-Array Buffer kopieren
if (strstr(Buffer, term.c_str()) != NULL) // gesuchte(s) Zeichen drin
{
Serial.println(String(Buffer));
return (true); // ok
}
}
return (false);
}
Ist quick and dirty, aber müsste dir helfen... Wichtig ist auch das timing, manche Befehle an das SIM800 brauchen etwas Zeit.
Es ist doch unsinnig ist erst ein String Objekt zu verwenden und das dann in ein Array zu kopieren
1.) Selbst mit Mitteln der Arduino IDE kann man direkt in ein char Array einlesen
2.) Für reinen Lese-Zugriff kommt man mit c_str() an das interne Array eines String Objekts
3.) Es ist auch nicht schwer das per Hand zu machen und Zeichen für Zeichen in ein char Array zu schreiben. Dann geht das auch ohne Blockierung und Timeout
Serenifly:
Es ist doch unsinnig ist erst ein String Objekt zu verwenden und das dann in ein Array zu kopieren
1.) Selbst mit Mitteln der Arduino IDE kann man direkt in ein char Array einlesen
2.) Für reinen Lese-Zugriff kommt man mit c_str() an das interne Array eines String Objekts
3.) Es ist auch nicht schwer das per Hand zu machen und Zeichen für Zeichen in ein char Array zu schreiben. Dann geht das auch ohne Blockierung und Timeout
Und könntest das etwas näher erläutern? Für manche ist es vielleicht doch schwer....