- Akku Tests und Balkonkraftwerk Speicher         
Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 18

Thema: Inhalt in einem String löschen

  1. #1
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    25.03.2006
    Ort
    Hinsdorf
    Alter
    49
    Beiträge
    381

    Inhalt in einem String löschen

    Anzeige

    Praxistest und DIY Projekte
    Na nen juten Abend!

    ich hab da mal ein Problem:

    Ich empfange über einen UART einen String den ich per:
    Code:
    Config Serialin1 = Buffered , Size = 100 , Bytematch = All                                                                                            
    Dim Gsm_rx_str As String * 100 At _rs232inbuf1 Overlay
    angegeben habe. Nun empfange ich einmal 6 Zeichen, die mir richtig angezeigt werden

    Code:
    Sub Gsm_ok(byval Rxlen As Byte)
    Do
    If _rs_bufcountr1 >= Rxlen Then
        Print "Gsm_rx_str " ; Gsm_rx_str
       Gsm_rx_str = ""
       Clear Serialin1
       Exit Do
    End If
    Loop
    End Sub
    mit z.Bsp.: <\r><\n>OK<\r><\n>
    Danach empfange ich 22 Zeichen die wiederum richtig angezeigt werden.
    Aber jetzt.... danach empfange ich wieder 6 zeichen aber es werden dann im Anschluss noch die Zeichen aus der vorhergehenden Sendung mit ausgegeben. Die soll so nicht sein, ich dachte mit : Gsm_rx_str = "" sollte der String gelöscht werden. Aber das macht es nicht.

    Nun... wie kann ich meinen dev. String den Inhalt löschen, ihn auf 0 setzen?

    Würde mich für Hilfe sehr freuen !

    Grüße MAT

  2. #2
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    08.09.2007
    Ort
    Berlin
    Alter
    31
    Beiträge
    1.578
    Hallo,

    bin mir nicht ganz sicher, aber ich habe doch die starke Vermutung, dass dir das "At xxx Overlay" da dazwischenfunkt. Probier doch mal aus, dieses zu löschen (falls dies das Programm zulässt).

    Gruß
    Chris

  3. #3
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    25.03.2006
    Ort
    Hinsdorf
    Alter
    49
    Beiträge
    381
    Hi Chris,
    jetzt macht es bei mir klick! Du hast natürlich recht! Ich werde das gleich mal testen...

  4. #4
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    16.02.2006
    Beiträge
    1.113
    Dein Problem liegt mehr darin, dass im Byte_array _RS232INBUF1 kein String mit einem Stringendezeichen (0-Byte) abgelegt wird, sondern nur einzelne Bytes. Dein
    Print Gsm_rx_str
    wird aber so viele Zeichen ausgeben, bis irgendwann ein Stringende gefunden wird.
    Wenn du nun mit
    Gsm_rx_str = ""
    das erste Zeichen auf Stringende setzt und dann wieder neue Zeichen einliest, stehen dahinter immer noch die alten Zeichen. Also wird dein Print die auch wieder ausgeben. Da hilft auch das
    Clear Serialin1
    nicht, da es auch nur das erste Byte von _RS232INBUF1 und den Zeichen Counter _RS_BUFCOUNTR1 auf 0 setzt.
    Du musst also selber das Stringende Zeichen setzen. Das geht einfach so:
    _RS232INBUF1(_RS_BUFCOUNTR1 + 1) = 0
    _RS232INBUF1(_RS_BUFCOUNTR1) zeigt auf das letzte gelesene Zeichen, _RS232INBUF1(_RS_BUFCOUNTR1 + 1) also auf das danach. Vorsichtig musst du noch sein, wenn tatsächlich mal 100 Zeichen eingelesen werden, dass du dann nicht das 101. mit einer 0 beschreibst.
    Geändert von for_ro (15.05.2011 um 10:27 Uhr)

  5. #5
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    25.03.2006
    Ort
    Hinsdorf
    Alter
    49
    Beiträge
    381
    Nen guten,

    @ for_ro:

    vielen Dank für Deine ausgiebige Antwort! So wie Du das beschrieben hast, wurde es mir über die Zeit dann auch klar und von Dir bestätigt!
    Ich überlege mir gerade, ob es nicht besser wäre, wenn ich nach der Auswertung des Buffers nicht den ganzen Buffer mit einer 0 überschreibe, abhängig von der Anzahl empfangener Zeichen:

    rs232_dummy = Memcopy(mem_dummy , _RS232INBUF1 , _RS_BUFCOUNTR1 , 2)

    was das aber an Rechenzeit bedarf weiß ich nicht....

  6. #6
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    25.03.2006
    Ort
    Hinsdorf
    Alter
    49
    Beiträge
    381
    Sooo....
    Ich habe jetzt die obrige Form zur Löschung des _RS232INBUF1 genutzt. Da es ja einen Bytezähler für die eintreffen Byte gibt, kann dieser schön zum genauen Löschen des Empfangspuffer genutzt werden:
    rs232_dummy = eine Bytevariable zur Zwischenspeicherung, die nicht weiter genutzt wird
    mem_dummy = eine Bytevariable die ich missbrauche, in der steht nur eine Null drin, da ja der Buffer gelöscht werden soll
    _RS232INBUF1 = hier wird jetzt die Null rein geschrieben, da es aber ein Bytearray ist muss dies für jede Stelle erhöht werden => dies besagt die 2 am Ende
    _RS_BUFCOUNTR1 = der Counter sagt an wie oft _RS232INBUF1 mit einer Null beschrieben werden soll.

    Zur Funktion von Memcopy nochmals die Hilfe lesen, dort steht alles drin

  7. #7
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    16.02.2006
    Beiträge
    1.113
    Hallo mat-sche,
    ich halte das Löschen des gesamten Bereichs zwar für überflüssig, aber wenn es jetzt funktioniert, ist es ja gut.
    Sieht ein wenig nach Holzhammermethode aus. Dir geht dadurch der ganze Vorteil des Overlays verloren.

  8. #8
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    08.01.2006
    Beiträge
    4.555
    Zitat Zitat von for_ro Beitrag anzeigen
    Hallo mat-sche,
    ich halte das Löschen des gesamten Bereichs zwar für überflüssig, aber wenn es jetzt funktioniert, ist es ja gut.
    Sieht ein wenig nach Holzhammermethode aus. Dir geht dadurch der ganze Vorteil des Overlays verloren.
    Ich bin mir jetzt nicht wirklich sicher, aber anstatt x="" ...x = " " (könnte ?) auch klappen. Langsam komme ich aus dem Training.

    Gruß Richard

  9. #9
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    25.03.2006
    Ort
    Hinsdorf
    Alter
    49
    Beiträge
    381
    @for_ro

    "Dir geht dadurch der ganze Vorteil des Overlays verloren."

    Na eigentlich nicht!?! Ich lege ja mir einen String über den Bytebuffer weil ich dann damit weiter als String arbeiten kann und ich nicht extra eine for/next Schleife bauen müsste, um die Daten aus dem Buffer in den String zu bekommen. Und ich benötige nur für den Zeitraum bis zum neuen Empfang neuer Daten die Daten aus dem Bytebuffer...

    Oder sehe ich da was falsch?
    Nun ja, es ist die Hammermethode, aber so bin ich mir sicher, dass alle Zeichen im _RS232INBUF1 auf 0 liegen. Es koste Zeit die Bytes zu löschen.... ich werde nochmal darüber nachdenken

    Aber Dank dennoch an alle und noch einen schönen Sonntag!

    Grüße MAT

  10. #10
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    16.02.2006
    Beiträge
    1.113
    Wenn du dir sicher sein kannst, dass während der String-Verarbeitung kein neues Zeichen eintrifft, wird das so schon funktionieren.
    Allerdings dauert ein memcopy länger als ein einfaches str1=str2, keine Ahnung warum. Zumindestens im Sim ist das so.
    Wie häufig kommen denn die Übertragungen und sind sie in regelmäßigen Abständen? Welche Baudrate benutzt du dabei?

Seite 1 von 2 12 LetzteLetzte

Ä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
  •  

MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad