SIM800L Handling

    Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

    Aufgrund technischer Veränderungen ist der Mailverkehr innerhalb des Forums (Private Nachrichten) nur noch eingeschränkt möglich. Die Einschränkung ist notwendig, um zusätzliche Betriebskosten für das Forum zu vermeiden. Näheres zu den Hintergründen im Thread "Aktuelles zum Forum".Wir bitten um Verständnis.

    Hinweis kann nach Kenntnisnahme deaktiviert werden!

    • Pac-Man schrieb:

      Mein Problem ist jetzt ein CRLF am Stringanfang. Ich kriege das einfach nicht weg. Was kann ich da machen?
      Hab das jetzt so gelöst

      Quellcode

      1. Empfangene_daten = S
      2. Empfangene_daten = Mid(empfangene_daten , 2)
      Soweit funktioniert es. Kann man das so machen? Sollte ich kontrollieren was ich vorne abschneide? Immerhin kann man sich ja nicht darauf verlassen dass das Modul immer CRLF am Anfang mit sendet.
    • Pac-Man schrieb:

      Sollte ich kontrollieren was ich vorne abschneide?
      Wenn es einerseits nicht sicher ist was da vorne ankommt und man anderenfalls aber alles verwenden möchte was kein Steuerzeichen ist, wird wohl nur eine Antwort zulassen :D .
      Also wird man überprüfen müssen ob da jetzt was ist was man braucht und den String in Ruhe lassen oder da ist eben ein unerwünschtes Steuerzeichen, dann muss man den String eben um dieses kürzen müssen.

      Hast du beim Auswerten (und vor allem beim Empfang) auch berücksichtigt, dass auch im eigentlichen SMS-Text Steuerzeichen enthalten sein können und zwar entweder ein CR oder ein LF (eines der beiden, ich erinnere mich jetzt nicht genau) für im SMS-Text befindliche Zeilenumbrüche. Oder kannst du sicher Ausschließen derartigen Text zu empfangen?
    • Zitronenfalter schrieb:

      dass auch im eigentlichen SMS-Text Steuerzeichen enthalten sein können und zwar entweder ein CR oder ein LF
      Das nicht aber... SMS Empfang soll nur zur Konfiguration erfolgen. Wenn der Konfigurator dann Mist sendet passiert halt nichts. Außerdem lösche ich ja nur die CRLF am Anfang der Nachricht.


      Pluto25 schrieb:

      (Echo ist aus ? )
      :cursing:


      Pluto25 schrieb:

      Ist der PC noch angeschlossen? Ein Mitschnitt (hex) wäre hilfreich.
      Ja. Mitschrift von einem Terminalprogramm das Ihr nicht mögt/kennt...

      41 54 45 30 0d 0d 0a 4f 4b 0d 0a 0d 0a 4f 4b 0d ATE0...OK....OK.
      0a 0d 0a 2b 43 50 49 4e 3a 20 52 45 41 44 59 0d ...+CPIN: READY.
      0a .
      0d 0a 43 61 6c 6c 20 52 65 61 64 79 0d 0a ..Call Ready..
      0d 0a 53 4d 53 20 52 65 61 64 79 0d 0a 0d 0a 4f ..SMS Ready....O
      4b 0d 0a 0d 0a 4f 4b 0d 0a K....OK..


      ist die Antwort auf

      Quellcode

      1. Sub Sim800_init
      2. Led_5 = 0 'Fehler LED aus
      3. Flag_fehler = 0 'Fehlerflag löschen
      4. Sim_reset = 0 : Waitms 200 : Sim_reset = 1 : Wait 5 '10 'SIM800l mit portpin resetten
      5. 'Print "AT" ; Chr(13); 'modul erreichbar?
      6. 'Call Auf_string_warten( "OK" , 1 , "Keine Antwort auf AT")
      7. Print "ATE0" ; Chr(13); 'echo abschalten
      8. If Flag_fehler = 0 Then Call Auf_string_warten( "OK" , 1 , "Keine Antwort auf ATE0")
      9. If Flag_fehler = 0 Then Print "AT+CPIN=1111" ; Chr(13 ) ; 'sim-pin eingeben
      10. If Flag_fehler = 0 Then Call Auf_string_warten( "OK" , 6 , "1" )
      11. If Flag_fehler = 0 Then Call Auf_string_warten( "+CPIN: READY" , 6 , "2" )
      12. If Flag_fehler = 0 Then Call Auf_string_warten( "Call Ready" , 6 , "3" )
      13. If Flag_fehler = 0 Then Call Auf_string_warten( "SMS Ready" , 6 , "Keine Antwort auf PIN Eingabe" )
      14. If Flag_fehler = 0 Then Print "AT+CMGF=1" ; Chr(13); 'modul für Text SMS konfigurieren
      15. If Flag_fehler = 0 Then Call Auf_string_warten( "OK" , 1 , "Keine Antwort auf SMS Konfiguration" )
      16. If Flag_fehler = 0 Then Print "AT+CSMP=17,167,0, 0" ; Chr(13) ; 'SMS Parameter konfigurieren
      17. If Flag_fehler = 0 Then Call Auf_string_warten( "OK" , 1 , "Keine Antwort auf SMS Parameter")
      18. 'Print "AT+CMGL=" ; Chr(34) ; "ALL" ; Chr(34) ; Chr(13)
      19. End Sub
      Alles anzeigen
      " Die Onrxd "produziert" für Gewöhnlich keine CrLf, allerdings "ignorierte" Lf (10) "

      Onrxd nicht, das Modul macht das. So wie ich sehe sendet es vor und nach jeder Antwort CRLF. Ich suche nicht mehr nach LF sondern jetzt nach CR.


      Pluto25 schrieb:

      PS Weshalb stören die? Solange mit instr/charpos gearbeitet wird ist es nur (kaum störender?) Zeitverlust
      Das mag sein. Inzwischen suche ich so...

      Quellcode

      1. Do
      2. .
      3. .
      4. Loop Until Empfangene_daten = Suchstring
      5. 'und so
      6. If Left(empfangene_daten , 6) = "+CMTI:" Then Call Sms_empfangen(empfangene_daten)
      Wann da CRLF am Anfang steht klappt es nicht. Wenn ich CRLF lösche klappt das alles.

      Ich stelle es mir so einfacher vor...

      Quellcode

      1. Select Case Left(empfangene_daten , 6)
      2. Case "+CMTI:"
      3. ...
      4. Case "+CMGL"
      5. ...
    • Pac-Man schrieb:

      nur zur Konfiguration
      von etwas das keine Steuerzeichen braucht? Dann könnte die Onrxt alles unter ! (33 ) ignorieren.
      Oder unter 13 wie das auskommentierte If Temp > 13. Gab es ein Problem damit?
      Immer noch unklar wie ein Cr Lf in den Empfangsstring kommt. Es war kein Lf Lf?
      Auch noch unklar weshalb die 10 als Empfang-fertig Indikator nicht geht. Sendet das Modul nicht immer CrLf am ende (ausser bei >)? Bei 13 gibts (immer?) noch ein Lf das Entsorgt werden muß.
      Dann gibts noch die Möglichkeit zu kurze Nachrichten einfach "platt zu machen"

      Quellcode

      1. If Temp = 13 Then
      2. if n>2
      3. Empfangene_daten = S
      4. S = ""
      5. Flag_gefunden = 1
      6. N = 0
      7. else
      8. n = 0
      9. S = ""
      10. end if
      11. Else
      12. If Temp = $3e Then Flag_text_senden = 1
      13. If N < 150 Then
      14. 'If Temp > 13 Then
      15. S = S + Chr(temp)
      16. Incr N '( Das müsste in die If Temp...)
      17. 'End If
      18. End If
      19. End if
      Alles anzeigen

      Pac-Man schrieb:

      Ich stelle es mir so einfacher vor...
      Und schneller. Aber es benötigt zwingend einen sauberen Empfangsstring und die Onrxd hat "natürliche" Grenzen ihrer Intelligenz (8000 Takte)
    • Ist das >Modul ein ESP32-Modul?

      Wenn ja, habe ich damit auch meine Erfahrungen gemacht.
      CR oder RCLF wird immer nach der Antwort gesendet, nicht davor.
      Also etwa
      OK[CRLF]

      Das Teil sendet außerdem man nur ein CR und bei anderen Antworten ein CRLF.
      Ich hatte auch dolche Konstellationen, dass ein CRCRLF kam.

      Ein Weg dem Dilemma Herr zu werden ist, eine eigene Leseroutine zu schreiben, die so lange Byte für Byte aus dem Empfangsbuffer liest, bis ein CR oder ein LF gefunden wird.

      Bei jedem Aufrüf werden der Routine werden anfangs führende CR oder LF einfach ignoriert, bis ein vernünftiges Zeichen >32 kommt. Dann Byte für Byte lesen, bis CR oder LF.

      Als Buffer würde ich den SerialIn Buffer nehmen und den ausreichend groß halten.
      Also gar nicht mit Input aus dem Buffer in einen eigen String lesen und dort mit Charpos suchen,
      sondern direkt aus dem SerialIn-Buffer Byte für Byte lesen und den Empfangsstring zusammen setzen.

      Dafür brauch man auch keine eigene ISR schreiben. Die Bascom RxD ist da sehr effektiv.
      Abfrage einfach ber IsCharWaiting() und wenn ja, dann die Leseroutine starten.
    • Mitch64 schrieb:

      Den Hex-Mitschnitten nach verhält es sich fast so.
      Hallo Leute, ich möchte mich bei allen für meine Dummheit und für mein Unwissen entschuldigen. Sorry dass Ihr Euch so viel Kopfzerbrechen wegen mir gemacht habt. Alles was war hat eigentlich funktioniert bis auf ein paar Kleinigkeiten auf die ich selbst hätte kommen können, wären da eben nicht meine zwei erwähnten Eigenschaften.

      Dummheit:
      die Sache mit den CRLF hab ich mir selbst eingebrockt. Um zu sehen was der MC empfängt hab ich mir alles mit

      Print#2 , empfangene_daten

      ausgeben lassen. Richtig bemerkt, Ich hänge damit ein CRLF selbst an, vergleiche es mit dem was der PC empfängt (bei dem sie ja nicht ankommen) und versuche dieses CRLF wieder von meinem Programm aus zu löschen. War ja der Meinung dass ich im Programm was vermurkse.

      Unwissenheit:
      Hängt direkt mit dem Print #2 zusammen. Manche Strings vom Modul sehen so aus.

      +CMGR: "REC READ","+491727xxxxxxx","","20/10/29,12:36:41+04"
      Hallo

      OK

      Soweit so gut, nur hab ich mich gewundert dass das "Hallo" nie ankam. Hmmmm, warum wohl? Irgendwann fiel der Groschen und ich hab mir nur die ersten 3 Buschstaben ausgeben lassen mit

      Print#2 , Left(empfangene_daten , 3)

      und siehe da, Alle antworten kommen an.

      Noch mal sorry und vielen Dank für Eure Geduld und Hilfe

      a_45_132ca9f5 x1000
    • Pac-Man schrieb:

      Alle antworten kommen an.
      Die kommen Alle hintereinander? Dann besser gegen die "Michael Direktive" verstoßen und ein Printbin #2 , temp in die Onrxd. Idealerweise mit stark höherer Baudrate (>= 115kBaud) damit der Ablauf nicht kollabiert.
      Die Schaltung mit den Dioden (#1) ist nicht mehr aktuell?
      PS Mir fehlt das "Hallo" ;(
      PPS Bei mir fehlten Abarbeitungen (anderes Projekt) weil ich aufs LCD ausgab a_67_e210de67
    • Pac-Man schrieb:

      Ich hänge damit ein CRLF selbst an,
      Ja, hatte ich im Beitrag #8 schon geschrieben

      Michael schrieb:

      Auch das Print #2 Incoming_data sendet an den PC mindestens ein CRLF, was ja so im Datenstrom nicht vorkommt
      Und in Beitrag #10

      Und im Beitrag #19

      Und nach dem dritten mal ist es meiner Meinung nach nicht mehr nötig, weiter Tips zu geben, wenn sie nicht ankommen.
      Wenigstens hast du jetzt nach 70 Posts dieses Teilproblem erkannt.
    • Michael schrieb:

      wenn sie nicht ankommen.
      Sorry, auf Grund Deines Vorschlags bin ich von seriel0charmatch auf onrxd umgestiegen und hab dann mich da einarbeiten müssen. Das hat eine Weile gedauert bis ich es kapiert hab. Deswegen hab ich den Rest nicht mehr beachtet.


      Pluto25 schrieb:

      Die kommen Alle hintereinander?
      Ja, soll doch auch so sein!?
      Die Print #2 brauche ich eigentlich nicht zum Betrieb. Hab die nur eingebaut damit ich sehe was der MC empfängt und als Ausgabe für Left() und Charpos().


      Pluto25 schrieb:

      Die Schaltung mit den Dioden (#1) ist nicht mehr aktuell?
      Doch, hängt immer noch dran. Warum?

      Pluto25 schrieb:

      PS Mir fehlt das "Hallo"
      Ähm, das "Hallo" war der Inhalt der SMS. Verstehe ich da was nicht?

      Gruß
    • Pac-Man schrieb:

      Ja, soll doch auch so sein!?
      ...
      hängt immer noch dran. Warum?
      ...
      war der Inhalt der SMS
      Genau das war die Frage. Ich habe hier kein Modul, muß also von dem "leben" was Du preisgibst. :/
      Weil der PC dort was anderes empfängt als aus #2. ?(
      Für den Inhalt und auch wie genau der ankommt reichen meine Hellseherfähigkeiten (quasi 0) a_56_df238249 leider nicht.

      Das mal was überlesen wird ist leider normal, aber

      Pac-Man schrieb:

      hab ich den Rest nicht mehr beachtet.
      "Da steht man in der Küche..." (und macht sich nen Haufen Arbeit - für die Katz) a_166_29aea317
    • Pluto25 schrieb:

      Weil der PC dort was anderes empfängt als aus #2.
      Jetzt passt es. Der PC empfängt:

      +CMGR: "REC UNREAD","+49172xxxxxx","","20/10/30,09:56:30+04"
      Test

      OK

      der MC sendet zum PC:

      +CMGR: "REC UNREAD","+49172xxxxxxx","","20/10/30,09:56:30+04"TestOK

      Pluto25 schrieb:

      "Da steht man in der Küche..."
      a_52_eb39d6ae Sooory!!! Durch die neue onrxd hab ich mich zu sehr darauf fokussiert.
    • Pluto25 schrieb:

      Gibt es schon einen Plan was es tun soll wenn der PC nicht mehr da ist?
      bei

      Sub Fehler_behandeln(fehler)

      mit einer Select case weiter machen

      case1 'Modul resetten
      Case2 'Modul initialisieren
      case3 'SMS an andere nummer schicken
      ...

      allerdings mache ich immer noch an meiner Empfangsroutine rum. Momentan warte ich immer auf ein OK. Das kommt aber nicht in allen Fällen. Ich fange so oft von vorne an bis ich es kapiert hab.
    • Pac-Man schrieb:

      kommt aber nicht in allen Fällen.
      nicht vom Modul oder nicht im MC zur Bearbeitung an?
      Der Pc kann beide Kanäle gleichzeitig anzeigen? Wenn die Terminalprogramme nun mitloggen und Zeitstempel einfügen sollte es gut zu erkennen sein wo(ob) was fehlt.
      Die drei Zeichen Print #2 brauchen solange wie drei Zeichen vom Modul. Kommt dann da sowas wie OK13101310 ist das ok weg. Mit höhere SWBaudrate sollte es besser werden. (Bascom warnt nicht falls sie zu hoch ist: 115k geht noch, 256KBaud sollte ausprobiert werden.)
    • Pluto25 schrieb:

      nicht vom Modul oder nicht im MC zur Bearbeitung an?
      Das Modul sendet sie nicht. Hier zum Beispiel eine.

      +CMTI: "SM",1

      Und hier kommt das OK.

      +CMGR: "REC UNREAD","+49172xxxxxxx","","20/11/04,07:27:14+04"
      Testnachricht

      OK

      Die erste Nachricht besteht aus einem String, die zweite aus mehreren mit CRLF. Wie kann ich diese aus dem String entfernen? Mit Replacechars Dummy , chr(13) , "-" funktioniert es nicht. Momentan addiere ich die Strings und warte auf das OK was natürlich dazu führt dass ich die erste Nachricht nicht erkenne.

      Quellcode

      1. Do
      2. If Flag_gefunden = 1 Then
      3. Flag_gefunden = 0
      4. Dummy = Dummy + Empfangene_daten
      5. 'Print #2 , ">" ; Left(empfangene_daten , 2)
      6. 'Print #2 , Empfangene_daten
      7. If Left(empfangene_daten , 2) = "OK" Then
      8. 'Replacechars Dummy , "c" , "-"
      9. Print#2 , Dummy
      10. Dummy = ""
      11. 'Nachricht mit OK abgeschlossen
      12. End If
      13. End If
      14. Loop
      Alles anzeigen
      Wenn ich mit If Left(empfangene_daten , 6) = "+CMGR:" Then suche dann fehlt mir der Inhalt der SMS.




      Pluto25 schrieb:

      Mit höhere SWBaudrate sollte es besser werden.
      SW Baudrate hab ich auf 14400, HW auf 9600. Heißt das Modul sendet mit 9600 der MC mit 14400. Mit 19200 hab ich manchmal komische Zeichen drinnen.

      Pluto25 schrieb:

      Die drei Zeichen Print #2 brauchen solange wie drei Zeichen vom Modul.

      Quellcode

      1. Onrxd:
      2. Incr N
      3. S = S + Chr(udr)
      4. 'If Udr = $3e Then Flag_text_senden = 1
      5. If Udr = 13 Then
      6. Empfangene_daten = S
      7. Flag_gefunden = 1
      8. N = 0 : S = ""
      9. End If
      10. If N < 150 Then N = 0
      11. Return
      Alles anzeigen
      Momentan ist es ja so dass jedes mal wenn CHR(13) empfangen wird ONRXD angesprungen wird. Wenn ich mit der Bearbeitung nicht fertig bin springt der MC zwischen drinnen rein und holt die neuen Daten. Die Verarbeitung geht dann natürlich in die Hose. Wie kann ich das verhindern? indem Ich N = 0 : S = "" an das Ende der Verarbeitung setze? Dann werde ich jedenfalls Daten verlieren. Der Puffer ist ja schließlich begrenzt If N < 150 Then N = 0

      Ich weiß nicht mal ob alle meine Überlegungen so stimmen.

      Gruß, Martin