Forum: Mikrocontroller und Digitale Elektronik GSM-Modul sendet SMS ohne Inhalt


von Maximilian P. (maxpis)


Lesenswert?

Guten Abend,
da ich keine Lösung zu meinem Problem finde, wende ich mich hier in 
diesem Forum. Für ein Projekt verwendet ich den Mikrocontroller ATSAMC21 
und das GSM-Modul SIM800L. In Atmel Studio programmier ich das Ganze. 
Nun zu meinem Problem. Ich kann eine SMS an mein Mobiltelefon 
verschicken, jedoch kommt die SMS ohne Text an und ich versteh nicht 
warum. Nachfolgend ist ein Teil meines Programms. Muss ich vor oder nach 
dem Text "Hallo" noch irgendwas einfügen, damit dies als Text erkannt 
wird oder wie ist die Lösung? Und ja ich weiß auch das man auf die 
Antwort vom GSM-Modul achten sollte. Das mit dem Delay ist nur zu 
Testzwecken da. Vielen Dank jetzt schon für Ihre Bemühungen.


        static uint8_t handshake[] = "AT\r";
        static uint8_t textmode[] = "AT+CMGF=1\r";
        static uint8_t number[] = "AT+CMGS=\"+491783167199\"\r";
        static uint8_t text[] = "Hallo";
        static uint8_t ctrlz[] = "\x1A";


  io_write(&USART_1.io, handshake, sizeof(handshake));
        delay_ms(2000);
  io_write(&USART_1.io, textmode, sizeof(textmode));
  delay_ms(2000);
  io_write(&USART_1.io, number, sizeof(number));
  delay_ms(2000);
  io_write(&USART_1.io, text, sizeof(text));
  delay_ms(500);
  io_write(&USART_1.io, ctrlz, sizeof(ctrlz));

von pegel (Gast)


Lesenswert?

Sind nicht die meisten SMS ohne Inhalt? ;)

Nein im Ernst, braucht das Hallo nicht auch ein Ende? CR, NL oder 0?

von sid (Gast)


Lesenswert?

glaub auch dass da nur der terminator fehlt.

apropos angriff der roboter:
Macht es nciht vielleicht sinn Diene Telefonnummer aus dem Code zu 
entfernen? ;)

von Maximilian P. (maxpis)


Lesenswert?

Vielen Dank für die Antworten.
Keiner der Lösungsvorschläge hat aber leider nicht funktioniert.
Ich hab diese Lösungsvorschläge ausprobiert:

static uint8_t text[] = "Hallo\r";
static uint8_t text[] = "Hallo\0";
static uint8_t text[] = "Hallo0";
static uint8_t text[] = "Hallo\n";

Habt Ihr evtl. noch andere Vorschläge?

von Hakim (Gast)


Lesenswert?

"Normalerweise" wartet man auf das '>'-Zeichen bevor man den Inhalt der 
SMS zum Modem überträgt.

von pegel (Gast)


Lesenswert?

Versuche mal an Stelle von sizeof(text) direkt 6 einzusetzen.

von pegel (Gast)


Lesenswert?

Nein, sorry hatte char im Hinterkopf.

von Maximilian P. (maxpis)


Lesenswert?

Das mit sizeof(text) durch 6 zu ersetzen hat leider auch nicht 
funktioniert.
Ich habe jetzt ein Eintrag bei Stackoverflow gefunden:

https://stackoverflow.com/questions/47576988/sim800l-blank-sms-issue

Da gab es das gleiche Problem und wurde anscheinend gelöst. Aber ich 
versteh nicht was genau da gemeint ist mit: The whole payload was 
followed by a '\0' which is unexpected.
Könnte mir das mal einer bitte erklären. Muss ich das \0 im string 
löschen?

von Mw E. (Firma: fritzler-avr.de) (fritzler)


Lesenswert?

hier stand mist, weil ich was überlesen hatte.

: Bearbeitet durch User
von pegel (Gast)


Lesenswert?

Der Verkäufer:
https://www.hotmcu.com/sim800-gsmgprs-module-p-302.html

hat einen Beispiel Code angehängt.
Ist zwar Ardu*, spielt aber keine Rolle.
In der .print Funktion werden die Zeichen angegeben, die wirklich 
übertragen werden:
1
void SendMessage()
2
{
3
  GSMSerial.print("AT+CSCS=");  
4
  GSMSerial.print('"');  
5
  GSMSerial.print("GSM");
6
  GSMSerial.print('"');
7
  GSMSerial.print("\r\n");
8
9
  delay(1000);
10
  GSMSerial.print("AT+CMGF=1\r\n");
11
  delay(1000);
12
      
13
  GSMSerial.print("AT+CMGS=");  
14
  GSMSerial.print('"');  
15
  GSMSerial.print("18067933376");      //发送目标手机号在这里设置
16
  GSMSerial.print('"');
17
  GSMSerial.print("\r\n");
18
  delay(1000);
19
  GSMSerial.print("Hello World!");      //短信内容
20
  delay(1000);
21
  GSMSerial.write(0x1A);      //发送操作
22
  delay(1000);
23
}

von Walter T. (nicolas)


Lesenswert?

Ich habe es gerade probiert: Bei mir funktioniert es fehlerfrei, eine 
SMS an +491783167199 zu senden.

von Michael R. (mr-action)


Lesenswert?

Mach sizeof(text) -1 bzw. strlen(text).

Davon ab, guck dir mal an, wie das mit den Strings in den char Arrays 
funktioniert und dann weißt du auch wo das \0 her kommt und warum du das 
grade munter mit verschickst...

(Dir fehlen da noch ein paar C Basics...)

: Bearbeitet durch User
von Maximilian P. (maxpis)


Lesenswert?

Walter T. schrieb:
> Ich habe es gerade probiert: Bei mir funktioniert es fehlerfrei,
> eine
> SMS an +491783167199 zu senden.

Haben Sie jetzt wirklich eine SMS an die Nummer geschickt, weil keine 
angekommen ist.

Also bei mir funktioniert es immer noch nicht und ich finde einfach den 
Fehler nicht, warum der Text nicht mitgesendet wird.

von Karl (Gast)


Lesenswert?

Maximilian P. schrieb:
> Keiner der Lösungsvorschläge hat aber leider nicht funktioniert.

Wo ist dann das Problem? Wenn keiner nicht funktioniert hat, dann haben 
doch alle funktioniert? Problem gelöst.

von pegel (Gast)


Lesenswert?

Maximilian P. schrieb:
> Also bei mir funktioniert es immer noch nicht und ich finde einfach den
> Fehler nicht

Dann wird es höchste Zeit mit einem RS232 Wandler das Modul per Hand im 
Terminalprogramm anzusprechen und auf Ergebnisse zu achten.

von Edward C. (teddy)


Lesenswert?

GSMSerial.print("\r\n");

"AT+CMGS=\"+491783167199\"\r";

Mal checken?

Teddy

von Ben B. (Firma: Funkenflug Industries) (stromkraft)


Lesenswert?

> static uint8_t number[] = "AT+CMGS=\"+491783167199\"\r";
Wäre möglich, daß das hinten ein \r\n sein muß.

Ich hab das ansonsten mal mit dem Quellcode meiner Alarmsau verglichen 
(die auch ein SIM800L benutzt) und mir fällt kein weiterer Untschied 
auf.

von Idiotenhasser (Gast)


Lesenswert?

Es gibt echt Leute, die es noch nicht mal schaffen, korrekt 
abzuschreiben.

von pegel (Gast)


Lesenswert?

Ben B. schrieb:
> Wäre möglich, daß das hinten ein \r\n sein muß.

Ist im China Beispiel auch so.
Wäre interessant, wenn das Hallo als Teil der Telefonnummer 
interpretiert wird.

von Hakim (Gast)


Lesenswert?

Maximilian P. schrieb:
> Also bei mir funktioniert es immer noch nicht und ich finde einfach den
> Fehler nicht

Es könnte daran liegen, dass du ein Ignorant bist.

von Ben B. (Firma: Funkenflug Industries) (stromkraft)


Lesenswert?

Die Telefonnummer interpretiert er korrekt, sonst würde keine leere SMS 
ankommen.

Das SIM800L ist relativ "fehler-tolerant", also wenn man Mist damit 
baut, macht es trotzdem irgendwas, nur eben meistens nicht das was es 
soll. Es wäre möglich, daß es ohne korrekten Zeilenabschluss den Text 
einfach nicht findet, weil es den in der nächsten Zeile erwartet.

Mein Code sendet auch überall \r\n, das ">" bei der Eingabe des 
SMS-Textes ignoriere ich ebenfalls, ich warte nur sicherheitshalber bis 
das Kommando mit der Telefonnummer vollständig gesendet wurde +5ms bevor 
ich die zweite Zeile mit dem SMS-Text sende. Funktioniert zuverlässig.

von pegel (Gast)


Lesenswert?

Ben B. schrieb:
> Die Telefonnummer interpretiert er korrekt, sonst würde keine leere SMS
> ankommen.

Ich habe viele gleiche Ziffern in meiner Tel-Nummer am Ende.
Mich hat mal einer angerufen, der meinte er hat immer weiter fleißig die 
Ziffer gedrückt. Egal wie viele verbunden wurde trotzdem.

Kannst ja mal probieren.

von Wolfgang (Gast)


Lesenswert?

pegel schrieb:
> Ich habe viele gleiche Ziffern in meiner Tel-Nummer am Ende.
> Mich hat mal einer angerufen, der meinte er hat immer weiter fleißig die
> Ziffer gedrückt. Egal wie viele verbunden wurde trotzdem.

Was soll die Telefonvermittlung auch machen, wenn im Baum der Wählrelais 
keine weitere Verzweigung kommt. Wenn das in der elektronischen 
Vermittlung genauso ist, bedeutet es nur, dass sie kompatibel zur alten 
Relaiswahl ist.

von Walter T. (nicolas)


Lesenswert?

Walter T. schrieb:
> Ich habe es gerade probiert: Bei mir funktioniert es fehlerfrei, eine
> SMS an +491783167199 zu senden.

Maximilian P. schrieb:
> Haben Sie jetzt wirklich eine SMS an die Nummer geschickt, weil keine
> angekommen ist.

Nein. Das hat sich heute morgen lustiger gelesen als jetzt.

von Alex D. (allu)


Lesenswert?

Probehalber mal den SMS-Text mit Chr(26) abschliessen.

von Marq (Gast)


Lesenswert?

Alex D. schrieb:
> Probehalber mal den SMS-Text mit Chr(26) abschliessen.

Ahh, guten Ideen!

Ich hatte das Problem mal mit einer Prepaid-Karte. Sobald das Guthaben 
aufgebraucht war kam zwar eine SMS an, aber ohne Inhalt.

von Martin H. (horo)


Lesenswert?

Marq schrieb:
> Ich hatte das Problem mal mit einer Prepaid-Karte. Sobald das Guthaben
> aufgebraucht war kam zwar eine SMS an, aber ohne Inhalt.

Das reicht doch wunderbar, um für den Heizungswächter ein Alarmbit zu 
übertragen.

von Harlekin (Gast)


Lesenswert?

Martin H. schrieb:
> Marq schrieb:
>> Ich hatte das Problem mal mit einer Prepaid-Karte. Sobald das Guthaben
>> aufgebraucht war kam zwar eine SMS an, aber ohne Inhalt.
>
> Das reicht doch wunderbar, um für den Heizungswächter ein Alarmbit zu
> übertragen.

Unter Einbezug von Zeitabständen ist sogar Morsen möglich.

von Stefan F. (Gast)


Lesenswert?

Maximilian P. schrieb:
> Habt Ihr evtl. noch andere Vorschläge?

\r\n

Aber ich glaube nicht, dass das die Problemursache ist. Ich habe früher 
am Ende keinen Terminator angehängt, das waren allerdings andere GSM 
Modems.

sizeof() ist auf jeden Fall falsch, denn das liefert die Größe des 
String-Arrays einschließlich der Ende-Markierung \0. strlen() ermittelt 
die Anzahl der Zeichen korrekt.

Ich rate mal ins Blaue:

Sende mal einen Text mit genau 8 Zeichen oder einem Vielfachen davon. 
Ich könnte mir vorstellen, dass die Firmware des GSM Modul einen Bug in 
der PDU codierung hat.

von Michael R. (mr-action)


Lesenswert?

Ließt hier eigentlich jemand die Doku zu den Sachen, die er benutzt?

Laut dem AT Commands Manual 
(https://www.elecrow.com/wiki/images/2/20/SIM800_Series_AT_Command_Manual_V1.09.pdf) 
gehört hinter den Befehl ein \r und kein \r\n. Da muss man eigentlich 
sehr wenig raten oder probieren - ist sogar bei allen Modems so, mit 
dennen ich bisher gearbeitet habe.

Außerdem wäre da immer noch das sizeof(), das falsch ist - wie 
inzwischen schon zwei mal angemerkt wurde.

Und nach den "Änderungen" könnte mann dann wieder über den Code 
diskutieren, wenn es noch nicht geht.
Aber grundsätzlich drehen wir uns hier ordentlich im Kreis grade.

Edit: Achja, und der SMS Text ist doch mit Chr(26) also 0x1A (\x1A) 
abgeschlossen - zwar ist da noch ein \0 zwischen und eine überflüssige 
Wartezeit aber es scheint ja zu gehen. Ohne ein Ctrl+Z am Ende vom Text 
habe ich noch nie eine SMS raus bekommen.

: Bearbeitet durch User
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.