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));
Sind nicht die meisten SMS ohne Inhalt? ;) Nein im Ernst, braucht das Hallo nicht auch ein Ende? CR, NL oder 0?
glaub auch dass da nur der terminator fehlt. apropos angriff der roboter: Macht es nciht vielleicht sinn Diene Telefonnummer aus dem Code zu entfernen? ;)
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?
"Normalerweise" wartet man auf das '>'-Zeichen bevor man den Inhalt der SMS zum Modem überträgt.
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?
hier stand mist, weil ich was überlesen hatte.
:
Bearbeitet durch User
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 | }
|
Ich habe es gerade probiert: Bei mir funktioniert es fehlerfrei, eine SMS an +491783167199 zu senden.
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
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.
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.
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.
GSMSerial.print("\r\n"); "AT+CMGS=\"+491783167199\"\r"; Mal checken? Teddy
> 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.
Es gibt echt Leute, die es noch nicht mal schaffen, korrekt abzuschreiben.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.