SIM800L Handling

    This site uses cookies. By continuing to browse this site, you are agreeing to our Cookie Policy.

    • Franz wrote:

      Ich bin nicht sicher, ob ich tatsächlich alle Antworten auswerte aber es sind schon ziemlich viele.
      Danke. Dachte nur dass ich es zu kompliziert mache. Ich warte ja sogar auf das OK bei ATE0 dabei bin ich mir nicht mal sicher ob das Modul dieses Kommando ablehnen kann oder nicht mit OK beantworten kann.

      Gruß, Martin
    • Pac-Man wrote:

      Kann ich das auch so lösen?
      Kann jetzt unnötig sein aber ich habe überall u=udr um dann mit dem u weiterzuarbeiten. Wenn ich mich recht erinnere ändert sich das UDR irgendwann wenn neue Daten reinkommen? Gerade wenn die Abarbeitung länger dauert.
      Wenn das if n... vorne steht sollte es 50 sein. Bei 51 kann es noch zu 52 werden womit wieder irgendwas (das n zufällig weils nach dem S gedimmt wurde) gecrascht wird.

      Pac-Man wrote:

      Oder muss es jedes mal in S gemacht werden nachdem If Flag_gefunden=1 ?
      Muss das S="" dann überhaupt sein?
      Nein, nur irgendwo bevor S benutzt wird.
      Auch nicht, Seine Länge wird ja von der Onrxd bestimmt.

      Würde das xxxx.contains(yyy) nicht auch die Position ausgeben wie instr ?

      Pac-Man wrote:

      Ich warte ja sogar auf das OK bei ATE0
      Wenn nicht könnte Dein Programm das OK fälschlicherweise als Antwort auf die nächste Anweisung halten.
      Auch wenn dieses OK nicht wichtig ist wäre es vielleicht sinnvoll das Modul ausreden zu lassen bevor es was neues bekommt. Unnötige Antworten müssen nicht unbedingt ausgewertet werden z.B.
      If Flag_gefunden = 1 Then nächste Anweisung ...

      The post was edited 1 time, last by Pluto25 ().

    • Pluto25 wrote:

      ändert sich das UDR irgendwann wenn neue Daten reinkommen? Gerade wenn die Abarbeitung länger dauert.
      deswegen sollte der serielle Interrupt nur die Daten sammeln und bei Empfangsende (chr13) umkopiert werden.
      Dann hat das Hauptprogramm Zeit zur Bearbeitung und im URXC können schon wieder Daten gesammelt werden.
      Bei einer Baudrate von 9600 sind 8000 Takte zwischen den Zeichen, das ist eine ganze Menge. Trotzdem ist es ratsam, im Interrupt möglichst wenig Zeit zu verbringen.
    • Pluto25 wrote:

      Kann jetzt unnötig sein aber ich habe überall u=udr um dann mit dem u weiterzuarbeiten.

      Michael wrote:

      deswegen sollte der serielle Interrupt nur die Daten sammeln und bei Empfangsende (chr13) umkopiert werden.

      Ich muss zugeben dass ich mich mit dem Umkopieren etwas schwer tue. Wenn ich das in der ISR mache passt nichts mehr. aktuell hab ich das jetzt so gelöst.

      Source Code

      1. Declare Sub Sms_empfangen(byval Nachricht As String)
      2. If Position_suchstring <> 0 Then Call Sms_empfangen(s)
      3. Sub Sms_empfangen(nachricht)
      4. .
      5. .
      6. .
      Da ich S byval an die Sub übergebe habe ich es ja sozusagen umkopiert!?
    • Allerdings habe ich erneut ein Problem beim zerlegen eines String mich Charpos.

      Ich versuche den Speicherplatz einer SMS zu filtern. Dabei suche ich mit Charpos das ":" und das ","


      Source Code

      1. Sub Sms_loeschen(nachricht)
      2. Local Pos_anfang As Integer
      3. Local Anzahl As Integer
      4. Local Pos_ende As Integer
      5. Local Wert As String * 10
      6. Pos_anfang = Charpos(nachricht , ":" )
      7. Pos_ende = Charpos(nachricht , "," )
      8. Pos_anfang = Pos_anfang + 2
      9. Anzahl = Pos_ende - Pos_anfang
      10. Wert = Mid(nachricht , Pos_anfang , Anzahl )
      11. Print#2 , "Nachricht " ; Nachricht
      12. Print#2 , "wert " ; Wert ; "<>" ; Val(wert)
      13. Print#2 , "Pos_anfang " ; Pos_anfang
      14. Print#2 , "pos_ende " ; Pos_ende
      15. Print#2 , "Anzahl " ; Anzahl
      16. Print#2 , ""
      17. End Sub
      Display All
      Als Ergebnis bekomme ich folgendes:

      Nachricht +CMGL: 33,"REC READ","+49172xxxxxx","","20/10/27,02:10:34+04"
      wert 33<>33
      Pos_anfang 8
      pos_ende 2
      Anzahl 2

      Ich versteh das allerdings nicht. Warum ist Pos_ende=2?

      Warum ist das Ergebnis 2 bei "Anzahl = Pos_ende - Pos_anfang "?
      Für mich heißt das... 2-8=2 .
      Schon lange her aber ich meine mich erinnern zu können in der ersten Klasse bei der Rechnung ein anderes Ergebnis erhalten zu haben.

      Gruß, ein a_27_b277ca12
    • Pac-Man wrote:

      Ich muss zugeben dass ich mich mit dem Umkopieren etwas schwer tue. Wenn ich das in der ISR mache passt nichts mehr. aktuell hab ich das jetzt so gelöst.
      Ich meinte das etwa so:

      Dim Arbeitsstring As String * 30
      Dim Empfangsstring As String * 30
      Dim Zaehler As Byte
      Dim Temp As Byte
      Dim Flag As Bit

      On Urxc Seriellerinterrupt

      Do
      .....
      Hier wird der Arbeitsstring bearbeitet...If Flag = 1 usw.

      Loop

      Seriellerinterrupt:
      Temp = Udr
      If Temp = 13 Then
      Arbeitsstring = Empfangsstring
      Empfangsstring = ""
      Flag = 1
      Zaehler = 1
      Else
      If Zaehler < 30 Then
      Empfangsstring = Empfangsstring + Chr(Temp)
      Incr Zaehler
      End If
      End If

      Return
    • Was sollte es denn sonst sein? :D
      Schön wenn der vollständige Code vorliegen würde. Ich habs mal zusammengebestelt und hier funktioniert es richtig. Jedoch gibts einen Überlauf im Empfangsbuffer und gefährlich knapp werdende Stacks. Subs in Sub und dann noch etliche Locale benötigen ihren Platz. Entweder das stapeln lassen oder $framzise =200 , $swstack= 60 (80)?
      PS Kann so ne SMS nicht 160 Zeichen werden? Buffer > 210, $Framezise 3-400
      Ob Michael das so mit dem Umkopieren gemeint hat? Aber in jedem Fall kann so die SubSub in aller Ruhe die Nachricht auswerten ohne das neue Eingänge sie schreddern. :thumbsup:
      Da war ich jetzt etwas langsam.

      Michael wrote:

      im Interrupt möglichst wenig Zeit zu verbringen.
      Dafür hat Dein Beispiel aber viel Arbeit ;)
      Ungünstig wirds wenn zwei CR aufeinanderfolgen.
      Nicht zeitkritisch: den String summieren kostet doppelt soviel Zeit wie ein Array füllen, spart jedoch die 0 anzuhängen.

      The post was edited 1 time, last by Pluto25 ().

    • Pluto25 wrote:

      Dafür hat Dein Beispiel
      Es gibt mehrere Arten, einen seriellen Empfang zu erledigen.
      Ich wollte einen aufzeigen, der meiner Einschätzung des Kenntnisstandes des OP entspricht.


      Pluto25 wrote:

      Ungünstig wirds wenn zwei CR aufeinanderfolgen.
      bei 8000 Takten reicht es vielleicht, wobei nicht sicher ist, woher das erste CR kommt. Es könnte auch ein Übertragungsfehler sein (ich hatte ja ein paar Punkte zum Abarbeiten genannt)
    • djmsc wrote:

      Charpos sucht zwar den ganzen Text durch beendet aber die Suche beim ersten Vorkommen vom gesuchten Zeichen.
      Das ist mir bewusst, aber das Zeichen 2 ist sicher nicht ein Komma.

      Michael wrote:

      Ich meinte das etwa so:
      Ok. Das ziehe ich mir rein. Brauche etwas Zeit es zu verstehen.


      Pluto25 wrote:

      Was sollte es denn sonst sein?
      a_19_23577ce2 War das damals auch so? Zu lange her...


      Pluto25 wrote:

      und gefährlich knapp werdende Stacks. Subs in Sub und dann noch etliche Locale benötigen ihren Platz. Entweder das stapeln lassen oder $framzise =200 , $swstack= 60 (80)?

      Ok, hab das geändert und jetzt stimmt es wieder. Ist 'ne Krux, hab das mit den Werten schon 1000 mal durch gelesen aber ich kriege es nicht in meinen Kopf.


      Das kriege ich nun...

      Nachricht +CMGL: 34,"REC READ","+4917xxxxxxxx","","20/10/27,02:13:05+04"
      wert 34<>34
      Pos_anfang 8
      pos_ende 10
      Anzahl 2

      Pluto25 wrote:

      Ob Michael das so mit dem Umkopieren gemeint hat? Aber in jedem Fall kann so die SubSub in aller Ruhe die Nachricht auswerten ohne das neue Eingänge sie schreddern.
      Hat er wohl nicht. Arbeite mich da noch rein.

      Trotzdem wird noch fleißig geschreddert...

      Nachricht +CMGL: 1,"REC READ","+49172x","","20/10/27,07:47:21+04"
      Nachricht +CMGL: 3,"REC READ","+49172x","","20/10/27,19:16:07+04"
      Nachricht +CMGL: 21,"REC READ","+49172x","","20/10/27,01:25:35+04"
      Nachricht +CMGL: 24,"REC READ","+49172x","","20/10/27,01:30:35+04"
      Nachricht +CMGL: 26,"REC READ","+49172x","","20/10/27,02:01:44+04"
      Nachricht +CMGL: 28,"REC READ","+49172x","","20/10/27,02:02:09+04"
      Nachricht +CMGL: 30,"REC READ","+491727x","","20/10/27,02:04:11+04"
      Nachricht +CMGL: 32,"REC READ","+491727x","","20/10/27,02:08:17+04"
      Nachricht +CMGL: 35,"REC READ","+491727x","","20/10/27,07:21:20+04"

      Speicherplatz 2,4,22,23,25,27,29,31,33,34 fehlen. Mein PC zeigt die Nachrichten an, der MC aber überspringt sie.


      Pluto25 wrote:

      Schön wenn der vollständige Code vorliegen würde
      Ist dabei.

      The post was edited 1 time, last by Pac-Man ().

    • Michael wrote:

      woher das erste CR kommt
      Aus Beitrag #1. :D
      Beim nochmaligen Nachsehen halte ich es für ein noch nicht ausgeschaltetes Echo. Ein Grund auch das OK vom ATE0 auszuwerten.
      Oder das ATE0 weglassen als Härtetest für die Empfangs/Auswerteroutinen.


      Pac-Man wrote:

      der MC aber überspringt sie.
      kommen sie zu schnell? Wieviel/schnell sendet das Modul? Alle nacheinander oder einzeln auf Anforderung?Die Nachrichten die durchkommen sind Vollständig erhalten?

      PS Es wäre schön den Code umzubenennen / Verisonsnummern zu verpassen. Ich habe nun zweimal Test2 in verschiedenen Ausführungen. An anderer Stelle hat das mal gefühlte 30 Threats gebraucht herauszufinden das wir von verschiedenen Codes sprachen.

      The post was edited 1 time, last by Pluto25 ().

    • Michael wrote:

      Ich wollte einen aufzeigen, der meiner Einschätzung des Kenntnisstandes des OP entspricht.
      Der ist recht niedrig. Ich versuche verzweifelt Visual Basic nach Bascom zu übersetzen dabei sind meine Kenntnisse in VB schon recht mau. Ebenso muss ich es zeitlich noch auf die Reihe bringen...


      Pac-Man wrote:

      Nachricht +CMGL: 32,"REC READ","+49172xxxxxxx","","20/10/27,02:08:17+04"
      Das war heute früh um 2:08 Uhr. MIST! ich hab meine Nummer nicht gelöscht!
    • djmsc wrote:

      Was erwartest du da eigentlich?
      Die Anzahl an Zeichen die zwischen ":" und "," liegt?
      Ja. Ich brauche die Speichernummer welche eine SMS hat damit ich sie lesen oder in dem Fall löschen kann.

      Pluto25 wrote:

      PS Die Nachrichtenlänge wird in Zeile 319 noch auf 100 begrenzt - Absicht?
      Übersehen... Korrigiert.


      Pluto25 wrote:

      Nun bekommt der PC das atcpin.. nicht mehr zu hören?
      Nein, nur das erste AT. Danach nur noch die Antworten vom Modul.
    • Hab jetzt die onrxd nach Michaels Vorschlag um geschrieben.

      Source Code

      1. Onrxd:
      2. Temp = Udr
      3. If Temp = 13 Then
      4. Empfangene_daten = S
      5. S = ""
      6. Flag_gefunden = 1
      7. N = 0
      8. Else
      9. If Udr = $3e Then Flag_text_senden = 1
      10. If N < 150 Then
      11. 'If Temp > 13 Then
      12. S = S + Chr(temp)
      13. 'End If
      14. Incr N
      15. End If
      16. End If
      17. Return
      Display All
      Mein Problem ist jetzt ein CRLF am Stringanfang. Ich kriege das einfach nicht weg. Was kann ich da machen?

      Gruß, Martin
    • Pac-Man wrote:

      Ich brauche die Speichernummer welche eine SMS hat damit ich sie lesen oder in dem Fall löschen kann.
      Ich habe gestern mal ein Testprogramm geschrieben und bei mir funktioniert Charpos

      BASCOM Source Code

      1. $regfile = "m8def.dat" 'specify the used micro
      2. $crystal = 8000000 'used crystal frequency
      3. $hwstack = 50 'default use 32 for the hardware stack
      4. $swstack = 50 'default use 10 for the SW stack
      5. $framesize = 50 'default use 40 for the frame space
      6. $lib "YwRobot_Lcd_i2c.lib"
      7. Const Pcf8574_lcd = 78 'Adresse des I2C-LCDs
      8. Dim _lcd_e As Byte
      9. Dim Lcd_backlight As Byte
      10. _lcd_e = 128
      11. Dim Test As String * 100
      12. Dim Pos_anfang As Byte , Pos_ende As Byte , Anzahl As Byte
      13. Config Scl = Portc.5 'Konfigurieren von I2C
      14. Config Sda = Portc.4
      15. Config Lcd = 16 * 2
      16. Config I2cdelay = 1
      17. 'warte bis Kondensator bei Ta0 geladen, auch für LCD-Init:
      18. Waitms 300
      19. Lcd_backlight = 1
      20. Test = "Nachricht +CMGL: 33,REC READ,+49172xxxxxx,,20/10/27,02:10:34+04"
      21. '**********************************************************
      22. '******************** Hauptprogramm ***********************
      23. Cls
      24. Lcd "Charpos-Test"
      25. Wait 2
      26. Pos_anfang = Charpos(test , ":" )
      27. Pos_ende = Charpos(test , "," )
      28. Pos_anfang = Pos_anfang + 1
      29. Anzahl = Pos_ende - Pos_anfang
      30. Locate 2 , 1
      31. Lcd Pos_anfang ; " " ; Pos_ende ; " " ; Anzahl
      32. Do
      33. Loop
      34. End
      35. 'Ende
      Display All
      Eine Lösung habe ich nicht, aber mir gefällt Ihr Problem.