- LiFePO4 Speicher Test         
Seite 2 von 2 ErsteErste 12
Ergebnis 11 bis 18 von 18

Thema: Inhalt in einem String löschen

  1. #11
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.842
    Anzeige

    Powerstation Test
    Das löschen kannst du dir sparen
    aaaaaaaaaaaaaaaaaber:
    Der Bascom _inuff ist ein Ringbuffer, d.h. wenn daten rein kommen, stehen die meist NICHT am Buffer anfang.
    Über den direkt einen string zu "overlayen" funzt nicht,.
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  2. #12
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    16.02.2006
    Beiträge
    1.113
    Zitat Zitat von PicNick Beitrag anzeigen
    Über den direkt einen string zu "overlayen" funzt nicht,.
    Klar funktioniert das! Man muss nur den Buffer nach der Verarbeitung initialisieren (Clear SerialIn), so wie er das auch gemacht hat. Dann wird der Pointer und alles andere wieder auf Anfang gesetzt.

  3. #13
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.842
    Da der Ringbuffer in der ISR asynchron beschrieben wird, müsst man sicher sein können, dass während der o.a. verarbeitung bis zum clear nix reinkommt, denn sonst ist das weg. Zuverlässiger Empfang ist anders.
    Aber jeder soll schreiben, wie er glaubt.
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  4. #14
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    25.03.2006
    Ort
    Hinsdorf
    Alter
    49
    Beiträge
    381
    Na da hab ich ja was angezettelt.....

    Alllssssoooo:

    beide haben recht, sag ich mal so. In meiner Situation funktioniert das hervorragend. Der Vorteil eines Overlay ist, dass ich nicht extra die Werte aus dem Ringbuffer in eine Stringvariable einlesen muss.
    Ich weiß wann und was in den Buffer gelegt wird und das ist mein Vorteil. Über
    Code:
    Serial1bytereceived:
    Pushall
    If Gsm_ini = 1 Then
       Incr Byte_in_count
       If Byte_in_count = 1 Then
       Enable Timer0
       Start Timer0
       End If
       Timer_count = 0
    End If
    Popall
    Return
    den Serial1bytereceived Interrupt bekomme ich mit, wann ein Zeichen in den Buffer gelegt wird. Dann starte ich einen Timer, über den ich dann das Ende abwarte. Also wenn kein Zeichen mehr rein kommt, dann läuft mein Timer über, setzt mir eine Variable und in einer Do - Loop lese ich dann den Buffer ein, setze den Counter wieder auf Null und leere den Buffer. Hier hatte ich das Problem, dass ich mit dem Overlay immer alle Zeichen im Buffer eingelesen habe und das wollte ich nicht.
    Es geht hierbei um Einlesen von bestimmten Zeichen wie z.Bsp. das Eintreffen einer SMS oder das Klingeln meines GSM-Modems. Da ich ja das "Absenderhandy" steuere, weiß ich wie oft ich ein Handlung mache wie z.Bsp. das Klingeln oder das Senden einer SMS...

    Wenn wir schon einmal dabei sind, in der Serial1bytereceived Interruptroutine sollte ich laut der Hilfe vorher die Register sichernush/popAll. Ich weiß nun nicht genau warum dies gemacht werden soll und ob es nötig wäre. Kann mir jemand von Euch dies erklären?

    Na gut, bin auf Antworten gespannt und wünsch ein schönen Abend!

  5. #15
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    16.02.2006
    Beiträge
    1.113
    Zitat Zitat von PicNick Beitrag anzeigen
    Da der Ringbuffer in der ISR asynchron beschrieben wird, ...
    Was meinst du damit?
    Wenn ein Zeichen empfangen wurde, wird eine separate ISR angesprungen, die das Zeichen in den RingBuffer schreibt und die Counter erhöht.
    Anschließend wird zum Label Serial1bytereceived gesprungen. Nun kann man den Inhalt auswerten.
    Finde ich ziemlich synchron.

  6. #16
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    16.02.2006
    Beiträge
    1.113
    Zitat Zitat von mat-sche Beitrag anzeigen
    ... den Serial1bytereceived Interrupt bekomme ich mit, wann ein Zeichen in den Buffer gelegt wird. Dann starte ich einen Timer, über den ich dann das Ende abwarte. Also wenn kein Zeichen mehr rein kommt, dann läuft mein Timer über, setzt mir eine Variable und in einer Do - Loop lese ich dann den Buffer ein, setze den Counter wieder auf Null und leere den Buffer. Hier hatte ich das Problem, dass ich mit dem Overlay immer alle Zeichen im Buffer eingelesen habe und das wollte ich nicht.
    Ich mag halt lieber die direkte Verarbeitung in der URXC ISR. Dann hast du selber die Kontrolle. Benutzt du Config SerialIn ... dann kannst du erst danach eingreifen.
    Deinen Timer könntest du dabei so lassen wie er ist, nur rufst du die ISR direkt auf, wenn ein Zeichen empfangen wurde. Das ist auch nichts anderes als ByteMatch=All.

    Zitat Zitat von mat-sche Beitrag anzeigen
    Wenn wir schon einmal dabei sind, in der Serial1bytereceived Interruptroutine sollte ich laut der Hilfe vorher die Register sichern push/popAll. Ich weiß nun nicht genau warum dies gemacht werden soll und ob es nötig wäre. Kann mir jemand von Euch dies erklären?
    Wie schon geschrieben, erzeugt Bascom bei Verwendung von Config SerialIn automatisch ein ISR, die beim Empfang jedes Zeichens aufgerufen wird. Die steht aber nicht in deinem QuellCode. Von dort aus wird dein Label angesprungen.
    Da Bascom Register während des Programmablaufs verwendet und man nie weiß, bei welchem Befehl der Interrupt auftrat, muss man alle Register sichern, die in der ISR verwendet werden. Dies macht der Compiler auch für seine ISR.
    Wenn dann aber zu deinem Label gesprungen wird und dort weitere Befehle verwendet werden, müssen deren benutzte Register auch wieder gesichert werden. Die Empfehlung ist dann pushall, falls man nicht weiß, welche Register dies sind.

  7. #17
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    25.03.2006
    Ort
    Hinsdorf
    Alter
    49
    Beiträge
    381
    Hi for_ro,

    Zitat Zitat von for_ro Beitrag anzeigen
    Ich mag halt lieber die direkte Verarbeitung in der URXC ISR. Dann hast du selber die Kontrolle. Benutzt du Config SerialIn ... dann kannst du erst danach eingreifen.
    Deinen Timer könntest du dabei so lassen wie er ist, nur rufst du die ISR direkt auf, wenn ein Zeichen empfangen wurde.
    wie würde denn solch eine direkte Verarbeitung in der ISR dann aussehen, hättest Du bitte mal ein Beispiel?
    In meinem Programm habe ich auch das Phänomen, dass während eines bestimmten Ablaufes der Kontroller resettet wird und ich weiß nicht warum.

    Danke & Gruß MAT

  8. #18
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    16.02.2006
    Beiträge
    1.113
    Anfangen würde ich z.B. so:

    Code:
    Dim Uart_buffer As String * 100
    Dim Byte_empfangen As Byte
    Dim Buffer_overlay(101) As Byte At Uart_buffer Overlay
    Dim Buffer_pointer As Byte
    
    On Urxc Urxc_isr
    Enable Urxc
    Enable Interrupts
    
    Do
       'deine Hauptschleife
    Loop
    
    End
    
    Urxc_isr:
       If Buffer_pointer < 100 Then Incr Buffer_pointer         'falls zuviele zeichen kommen, ist hier die Bremse
       Byte_empfangen = UDR
       'hier könntest du jetzt einige Checks machen, wie z.B. auf CR/LF oder auch eine Vorauswertung des Empfangs
       'wenn du z.B. das CR/LF gar nicht im Buffer abspeichern willst, dann lässt du den Befehl eben weg und setzt stattdessen nur ein Flag
       'welches du dann in der Hauptschleife auswertest.
       'auf die Art musst du nicht so viel machen, wenn deine Übertragung vollständig ist, sondern verteilst
       'dies auf die relativ langen Pausen zwischen den eingehenden Zeichen
    
       'hier kannst du auch deinen Timer starten um zu überprüfen, ob die Übertragung nicht aus irgendeinem Grund aufgehört hat
    
       Buffer_overlay(buffer_pointer) = Byte_empfangen          'und schließlich das Zeichen im Buffer abspeichern
    Return

Seite 2 von 2 ErsteErste 12

Ähnliche Themen

  1. Compact C: String löschen
    Von Fabian E. im Forum Robby RP6
    Antworten: 3
    Letzter Beitrag: 28.05.2010, 06:39
  2. Datenlgger 1000 SD - Anführungszeichen im String löschen?
    Von TobiasBlome im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 2
    Letzter Beitrag: 11.04.2010, 18:56
  3. Aus einem String Daten ausmaskieren
    Von Olli2301 im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 5
    Letzter Beitrag: 13.12.2006, 22:53
  4. String löschen
    Von Murus im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 2
    Letzter Beitrag: 15.01.2006, 17:19
  5. wahllos bits aus einem byte löschen
    Von churchi im Forum C - Programmierung (GCC u.a.)
    Antworten: 6
    Letzter Beitrag: 17.10.2004, 13:11

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

LiFePO4 Speicher Test