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
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. ...
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.