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:

      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 schrieb:

      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 schrieb:

      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 ...

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Pluto25 ()

    • Pluto25 schrieb:

      ä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 schrieb:

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

      Michael schrieb:

      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.

      Quellcode

      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 ","


      Quellcode

      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
      Alles anzeigen
      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 schrieb:

      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 schrieb:

      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.

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Pluto25 ()

    • Pluto25 schrieb:

      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 schrieb:

      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 schrieb:

      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 schrieb:

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


      Pluto25 schrieb:

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


      Pluto25 schrieb:

      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 schrieb:

      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 schrieb:

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

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Pac-Man ()

    • Michael schrieb:

      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 schrieb:

      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.

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Pluto25 ()

    • Michael schrieb:

      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 schrieb:

      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 schrieb:

      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 schrieb:

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


      Pluto25 schrieb:

      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.

      Quellcode

      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
      Alles anzeigen
      Mein Problem ist jetzt ein CRLF am Stringanfang. Ich kriege das einfach nicht weg. Was kann ich da machen?

      Gruß, Martin
    • Pac-Man schrieb:

      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-Quellcode

      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
      Alles anzeigen
      Eine Lösung habe ich nicht, aber mir gefällt Ihr Problem.