Bascom Steuerzeichen entfernen

Gast #3213764
Hallo,

bei serieller Übertragung bekommt man doch CarriageReturn oder LineFeed 
mitgeschickt, die man möglicherweise bei der String-Auswertung garnicht 
haben will. Da ist die Frage, wie man die elegant löscht.

Ich mache es so:

____________________________________________________

Dim Empfangene_daten As String * 20
Dim Empfangene_daten_byte(21) As Byte At Empfangene_daten Overlay

...

Strlen = Len(empfangene_daten)                     'Länge des 
eingegangenen Strings bestimmen

While Empfangene_daten_byte(1) = 10 Or Empfangene_daten_byte(1) = 13 
'solange der eingegangene String mit LineFeed oder CarriageReturn 
beginnt

Empfangene_daten = Mid(empfangene_daten , 2 , Strlen)       'schneide 
die erste Stelle weg

Strlen = Len(empfangene_daten)                  'Länge des eingegangenen 
Strings neu bestimmen

Wend      'Ende der While-Schleife
____________________________________________________

Die Frage ist jetzt, ob das nicht eleganter geht.

Gruß Tilmann
#3213808
CR bzw. CRLF sind doch die Zeilenende-Kennung.
Sie signalisieren, dass das bereits Empfangene gültig ist.

Für den Empfang bevorzuge ich den RXC-Interrupt.
In diesem prüfe ich auf CR (13) und LF (10).

LF wird völlig ignoriert, bei CR werden die bisher empfangenen Zeichen 
(die Anzahl steht im Empfangszeiger) aus dem Empfangspuffer (Array) in 
die Zielvariable (Array mit überlagertem String) kopiert und der 
Empfangszeiger (Index auf Empfangspuffer) wieder auf 1 gesetzt. Über 
eine Bytevariable wird dem Hauptprogramm mitgeteilt, dass neue Daten 
vorliegen und wieviele Zeichen im String gültig sind. Diese wird dann 
vom Hauptprogramm beim Analysieren der Daten gelöscht, so dass die Daten 
nur einmal bearbeitet werden.

Jedes andere im RXC-Interrupt empfangene Zeichen wird in das 
Puffer-Array an die Position des Empfangszeigers geschrieben und der 
Empfangszeiger erhöht. Erreicht dieser einen Wert außerhalb der 
Array-Größe, so wird über einen Merker (Bitvariable) ein Fehler gemeldet 
und der Empfang bis zum Eintreffen des nächsten CR ignoriert. Anhand der 
Fehlermeldung weiß das Programm, dass die Daten korrupt sind.

Das Hauptprogramm (oder eines seiner Unterprogramme) prüft nun die 
Bytevariable. Ist diese 0, kümmert sich das Hauptprogramm um andere zu 
erledigende Dinge. Ist diese größer als 0, wird der Fehler-Merker 
gefragt ob die Daten gültig sind. Sind sie gültig, werden die Daten 
verarbeitet und dann werden Fehler-Merker und die Bytevariable (für 
Anzahl der empfangenen Bytes) gelöscht.

Dies alles läuft völlig im Hintergrund, während sich das Hauptprogramm 
um andere Dinge kümmert.

...
Gast #6751436
Grad bei Google diese Frage gefunden, und ich habe auch noch eine 
Antwort für andere Suchende...
Problem bei mir: Manchmal sendet ein Terminal am ende CR/LF, manchmal 
nur CR, mein Code soll bei beidem funktionieren und simpel sein. 
Folgender Code guckt ob das erste Byte ein LF ist, falls ja, wird das 
abgeschnitten:
      LF_exists = charpos(inputstring,10) 'checkt auf LF (Ascii 10)
      if LF_exists =1 then
         inputstring=Mid(inputstring , 2)
      end if

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 13 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.