Forum: Mikrocontroller und Digitale Elektronik Bascom Steuerzeichen entfernen


von Tilmann (Gast)


Lesenswert?

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

von Hannes L. (hannes)


Lesenswert?

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.

...

von William (Gast)


Lesenswert?

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

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.