Forum: Mikrocontroller und Digitale Elektronik Arduino GSM Shield - Problem beim Senden einer SMS


von Ludwig M. (ludwigm)


Lesenswert?

Hallo,
ich habe versucht mit folgendem Code eine SMS zu senden:
1
// Include the GSM library
2
#include <GSM.h>
3
4
#define PINNUMBER "1234"
5
6
// initialize the library instance
7
GSM gsmAccess;
8
GSM_SMS sms;
9
10
[...]
11
12
void loop() {
13
[...]
14
  char txtMsg[] = "test";
15
  char remoteNum[] = "0123456789";
16
 
17
    // send the message
18
    sms.beginSMS(remoteNum);
19
    sms.print(txtMsg);
20
    sms.endSMS();
21
    Serial.println("\nCOMPLETE!\n");
22
    bo = false;
23
}
Leider bekomme ich keine SMS gesendet und das Programm bleibt bei 
sms.print hängen. Das Testprogramm der Arduino-IDE ("SendSMS") 
funktioniert ohne Probleme.

Hat jemand eine Idee was an dem Code falsch ist?

Vielen Dank im Voraus
ludwigm

von Dieter S. (Gast)


Lesenswert?

Warum baust du den Sketch nicht so auf, wie es das Beispiel vorgibt?
So hat es doch nach deiner Aussage funktioniert.
Da verlangt er doch auch diese Anweisung:

"modem.sendSMS("Hello from Arduino","01234567890");"

Somit muss der SMS-Text und die Nummer in einem Aufruf an das Modul 
geschickt werden.

von Ludwig M. (ludwigm)


Lesenswert?

Danke für die Antwort, Dieter S.
Ich habe das Beispiel geladen und dann versucht anzupassen.
Der SMS-Text und die Nummer müssen nicht in einem Aufruf an das Modul
geschickt werden.

Hier nochmal der Link zum Beispiel-Sketch: 
https://www.arduino.cc/en/Tutorial/GSMExamplesSendSMS

Dort wird folgende Syntax verwendet:
1
 sms.beginSMS(remoteNum);
2
  sms.print(txtMsg);
3
  sms.endSMS();

Im Beispiel-Sketch gibt es ja auch die Funktion readSerial(char 
result[]) die die Eingabe im seriallen Monitor verarbeitet. Mein Code 
aus dem ersten Post verwendet diese Funktion ja nicht, ich vermute, dass 
sich daraus ein Formatproblem ergibt.

1
int readSerial(char result[]) {
2
  int i = 0;
3
  while (1) {
4
    while (Serial.available() > 0) {
5
      char inChar = Serial.read();
6
      if (inChar == '\n') {
7
        result[i] = '\0';
8
        Serial.flush();
9
        return 0;
10
      }
11
      if (inChar != '\r') {
12
        result[i] = inChar;
13
        i++;
14
      }
15
    }
16
  }
17
}

Hat jemand eine Idee?
Danke im Voraus. ludwigm

von Dieter S. (Gast)


Lesenswert?

Ok, das ist ja auch ein anderer Sketch.
Du schriebst der Sketch aus der IDE, daraus habe ich die Anweisung 
entnommen.
Diesen Sketch muss ich mir erst ansehen.

von Ludwig M. (Gast)


Lesenswert?

Der Sketch ist aus der IDE. Ich habe diesen unter Datei -> Beispiele -> 
GSM -> SendSMS abgerufen.
Poster doch mal den Sketch den du meinst, vielleicht bekomme ich es ja 
damit hin.

Gruß Ludwigm

von Dieter S. (Gast)


Lesenswert?

Du solltest es genau so aufbauen, wie im Beispiel. Nur statt der 
serialRead Anweisung deine Daten (Telefonnummer und Text) übergeben.
Und am Ende der jeweiligen Daten "\n" mit einfügen.
Das macht die Funktion serialRead auch.

von Dieter S. (Gast)


Lesenswert?

Ludwig M. schrieb:
 Poster doch mal den Sketch den du
> meinst, vielleicht bekomme ich es ja damit hin.
>
> Gruß Ludwigm

Das geht aktuell nicht, da ich am Tablet poste und nicht am Rechner 
sitze.
Aber teste es mit den zuvor beschriebenen.

von Ludwig M. (ludwigm)


Lesenswert?

Hallo,
Dieter S. konntest du etwas herausfinden?

Gruß Ludwig

von Dieter S. (Gast)


Lesenswert?

Ich hatte doch geschrieben, was zu machen ist.
Hast du es probiert?

von Ludwig M. (ludwigm)


Lesenswert?

Hallo,
Sorry Dieter, deine Antwort hatte ich leider übersehen, keine Ahnung 
warum.
Ich habe es jetzt mal so getestet:
1
 // send the message
2
  sms.beginSMS("0123456\n");
3
  sms.print("test\n");    
4
  sms.endSMS();

Leider immer noch ohne Erfolg. Ich habe nochmal in der Referenz von 
Arduino die Methoden beginSMS() und print() nachgesehen. Bei beiden 
steht für den Parameter, dass dieser vom Typ 'char array' sein muss. Ich 
übergebe jetzt ja aber einen String.

Hat es bei dir denn so funktioniert?

Vielen Dank im Voraus
ludwigm

: Bearbeitet durch User
von Ludwig M. (ludwigm)


Lesenswert?

Hallo,
ich konnte das Problem immer noch nicht lösen.

Ich habe nochmal diesen Code ausprobiert, bei dem ein char-Array 
übergeben wird wie es von der Funktion gefordert wird.
1
char txtMsg[] = "test"; 
2
  char remoteNum[] = "0123456789";
3
  
4
    sms.beginSMS(remoteNum);
5
6
    sms.print(txtMsg);
7
        //bis hier läuft es, dann hängt es
8
    sms.endSMS();
9
10
    Serial.println("\nCOMPLETE!\n");

Habe auch '\0' und '\n' an die Date angefügt, beides ohne Erfolg.

1
char txtMsg[] = "test\n"; 
2
  char remoteNum[] = "0123456789\n";
Bin für jede Hilfe dankbar!
Gruß Ludwig

: Bearbeitet durch User
von ende inchar (Gast)


Lesenswert?

probier mal \0 statt \n

von Dieter S. (Gast)


Lesenswert?

Dann nimm mal "\r" ans Ende.

von Ludwig M. (ludwigm)


Lesenswert?

Ich habe einen kleinen Fortschritt gemacht.
Ich habe das Beispielprogramm der Arduino IDE schrittweise angepasst. 
Die Telefonnumer wird mit folgendem Code erfolgreich vorgegeben.
1
  char remoteNum[20];  // telephone number to send sms
2
  remoteNum[0] = '0';
3
  remoteNum[1] = '1';
4
  remoteNum[2] = '2';
5
         ....  
6
  remoteNum[11] = '4';
7
  remoteNum[12] = '\0';
8
9
  Serial.print("Now, enter SMS content: ");
10
  char txtMsg[200];
11
  readSerial(txtMsg);
12
13
  sms.beginSMS(remoteNum);
14
  sms.print(txtMsg);
15
  sms.endSMS();

Die Textnachricht wird in diesem Code mit dem Seriellen Monitor 
eingelesen (übernommen aus dem Beispielprojekt).
Ich habe versucht den Nachrichtentext ebenfalls im Code zu definieren:
1
 char txtMsg[20];
2
  txtMsg[0] = 'T';
3
  txtMsg[1] = 'e';
4
  txtMsg[2] = 's';
5
  txtMsg[3] = 't';
6
  txtMsg[4] = '\0';
Leider wird so keine SMS versendet.
Hat jemand eine Idee, warum es bei der Telefonnumer klappt, bei der 
Nachricht jedoch nicht?

Gruß Ludwig

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Kürzlich wies hier im Forum jemand darauf hin, daß man den 
Nachrichteninhalt mit Ctrl-Z abschließen müsste.

Ctrl-Z ist \x1a.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.