AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein String wird bei bestimmetem Byte nicht angezeigt
Thema durchsuchen
Ansicht
Themen-Optionen

String wird bei bestimmetem Byte nicht angezeigt

Ein Thema von willyxv · begonnen am 9. Mär 2011 · letzter Beitrag vom 10. Mär 2011
Antwort Antwort
willyxv

Registriert seit: 25. Okt 2010
29 Beiträge
 
Delphi XE Enterprise
 
#1

String wird bei bestimmetem Byte nicht angezeigt

  Alt 9. Mär 2011, 16:30
Hallo,

ich habe ein kleines Programm geschrieben, welches Daten über einen Com Port empfängt und daraus teildaten anzeigt. Dies funktioniert auch sehr gut solange nicht eine Fehlermeldung in Form eines einzelnen Bytes mitgeschickt wird.

Hier der Datensatz der empfangen wird:
in Grün die Teildaten (5,00)
in Blau die Bytes welche die Position bestimmen

80 F4 80 24 04 75 35 2C 30 30 72 32 35

Und hier das Programm um die Daten zu Filtern:

Delphi-Quellcode:
 
    Anfang := char($75);
    PostionsmarkeAnfang := Pos(Anfang ,KompletterDatensatz);
    Teildaten := Copy(KompletterDatensatz, PostionsmarkeAnfang + 1, 10);
    Ende := char($72);
    PostionsmarkeEnde := Pos(Ende ,Teildaten );
    Teildaten := Copy(Teildaten, 0, PostionsmarkeEnde - 1);
    Anzeige.Caption := Teildaten ;

Und hier der Datensatz mit Fehlermeldungsbyte:
in Grün die Teildaten (5,00)
in Blau die Bytes welche die Position bestimmen
Rot = Fehlermeldungsbyte

80 F4 80 24 04 75 OA 35 2C 30 30 72 32 35

Wird die Fehlermeldung mitgeschickt wird nichts mehr angezeigt. Bei der ausgabe der Anfangsposition und Endposition stimmen diese jedoch, nur auf der anzeige erscheint nichts mehr. Wid die Fehlermeldung nicht mehr mitgeschickt geht es wieder. Desweiteren funktioniert die Anzeige bei einigen Fehlern und hier wird das Fehlerbyte als - oder als ein anderes Symbol angezeigt.

Woran kann dies liegen? Am dem Byte 0A?



Bin für jede Hilfe dankbar

MfG Willy
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#2

AW: String wird bei bestimmetem Byte nicht angezeigt

  Alt 9. Mär 2011, 16:46
0A ist Dezimal 10 und somit ein Steuerzeichen, entweder LineFeed oder CarriageReturn. Und das kann ein Memo oder ähnliches nicht anzeigen.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
alfold

Registriert seit: 29. Jun 2010
Ort: Neustrelitz
393 Beiträge
 
Delphi 7 Enterprise
 
#3

AW: String wird bei bestimmetem Byte nicht angezeigt

  Alt 9. Mär 2011, 17:12
Darum sollte man generell, keine Steuerzeichen, wenn sie nicht ausgelesen und behandelt werden, über eine Schnittstelle schicken!
http://www.stefan-lenz.ch/bit_glossar/18.html

Gruss alfold

Geändert von alfold ( 9. Mär 2011 um 17:15 Uhr)
  Mit Zitat antworten Zitat
willyxv

Registriert seit: 25. Okt 2010
29 Beiträge
 
Delphi XE Enterprise
 
#4

AW: String wird bei bestimmetem Byte nicht angezeigt

  Alt 9. Mär 2011, 19:10
Danke für die schnellen Antworten.

Zitat:
Darum sollte man generell, keine Steuerzeichen, wenn sie nicht ausgelesen und behandelt werden, über eine Schnittstelle schicken!
leider entscheide ich nicht was über die Schnittstelle geschickt wird das entscheidet das Gerät.


Zitat:
0A ist Dezimal 10 und somit ein Steuerzeichen, entweder LineFeed oder CarriageReturn. Und das kann ein Memo oder ähnliches nicht anzeigen.
Dieses Steuerzeichen kommt nur ab und zu und nicht immer. Gibt es eine möglichkeit es aus dem String zu entfernen? oder zu erkennen ob es enthalten is damit man dann die Copy funktion so anpassen kann das es ausgelassen wird?

Mfg Willy
  Mit Zitat antworten Zitat
WM_CLOSE

Registriert seit: 12. Mai 2010
Ort: königsbronn
398 Beiträge
 
RAD-Studio 2009 Pro
 
#5

AW: String wird bei bestimmetem Byte nicht angezeigt

  Alt 9. Mär 2011, 19:34
Hier im Forum suchenTrim?
  Mit Zitat antworten Zitat
jobo

Registriert seit: 29. Nov 2010
3.072 Beiträge
 
Delphi 2010 Enterprise
 
#6

AW: String wird bei bestimmetem Byte nicht angezeigt

  Alt 9. Mär 2011, 19:36
Du kannst es z.B. mit StringReplace (unit Sysutils) gegen ein gewünschtes Zeichen austauschen oder ganz entfernen.
Aber in einem String stört 0A ja nicht, erst im Memo oder auf einem Drucker bekommt es Steuerfunktion.

Vielleicht ist es nur ein Tippfehler, aber in Deinem Beispiel steht nicht 0A sondern OA,
der Buchstabe O, der der vor P kommt. Du solltest jedenfalls Deinen Code auch auf solche Fehler prüfen.
Gruß, Jo
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.152 Beiträge
 
Delphi 12 Athens
 
#7

AW: String wird bei bestimmetem Byte nicht angezeigt

  Alt 9. Mär 2011, 20:02
Ich hab mir jetzt nicht alles durchgelesen, aber erstmal ein paar grundsätzliche Probleme.

Du möchstest eine Byte-Folge in einem UnicodeString abbilden?
nicht böse gemeint ... aber spinnst du?
Unicode ist 2 Byte pro Zeichen, das kann also niemals gut gehn,
(außer die Zeichen/Bytes bleiben im Bereich von $00 bis $7F, also ASCII)
denn hier wird ganz gern mal die Ansi-Unicode-Umwandlung zuschlagen, abgesehn von den "unnützen" Bytes zwischen jedem deiner Bytes.

Wenn, dann AnsiString nutzen, oder besser sogar TBytes (array of Byte) oder den RawByteString (welcher eine Umkodierung unterdrückt und somit AnsiChar <-> Char wenigstens bytegenau umkopiert)

Und das gewisse Bytes unterhalb von ' ' aka $20 oder 32 nicht einfach so angezeigt werden können, wurde bestimmt schon gesagt, da dieses Steuerzeichen sind.

PS: Char($ab) = #$ab , bzw. Char(123) = #123
Wozu muß man es sich schwerer machen ... es sei denn du nutzt direct AnsiChar zum Casten.

Beim Char hat man nämlich auch noch Probleme im Quelltext.
Bei #$ hat man dabei aber noch eine Möglichkeit einfluß zu nehmen wie die Zahl interpretiert wird, siehe #$85 und #$0085
http://www.delphipraxis.net/130228-a...nd-keines.html
Beides stellt zwar logisch einen gleichen Wert dar, aber für Delphi ist es unterschiedlich.


Zitat:
leider entscheide ich nicht was über die Schnittstelle geschickt wird das entscheidet das Gerät.
Das ist auch vollkommen egal, denn du entscheidest was davon wie angezeigt wird.
- entweder du nutzt eine Ausgabeform (Komponente), welche mit den Daten klar kommt
- oder du mußt die Daten so anpassen, daß die Anzeigekomponente damit klar kommt (z.B. die nötigen oder gleich alle Bytes nach HEX umwandeln)
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu ( 9. Mär 2011 um 20:06 Uhr)
  Mit Zitat antworten Zitat
alfold

Registriert seit: 29. Jun 2010
Ort: Neustrelitz
393 Beiträge
 
Delphi 7 Enterprise
 
#8

AW: String wird bei bestimmetem Byte nicht angezeigt

  Alt 9. Mär 2011, 20:19
Wenn solche Steuerzeichen an Deine Schnittstelle gesendet werden und Du sie nicht auswertest wirst Du immer wieder Fehler drin haben!
Deswegen ist es wichtig, bei solchen Dingen, ob man es Byteweise aussliest oder bis die Gegenstelle mir die Info sendet das die Übertragung zu Ende ist. Also liest man die Daten solange in ein Puffer ein, bis das Ende der Übertragung erreicht ist und wertet die Daten erst dann aus!
Denn auch dafür gibt es, wie für fast alles, ein Protokol. Dein Sender sollte sich also an das Protokol halten, dann weisst Du auch wann ein steuerzeichen kommt oder wann es Daten sind! Oder Du musst dich an das Protokoll halten und nicht einfach nur evtl Daten suchen, es könnten die Daten an dieser Position sein!
Denn so, wie ich es vermute, verwendst Du kein Protokoll, denn ein Linefeed wird nicht umsonst gesendet.

Mehr kann man da nicht sagen, dazu müsste man wissen schickt die Gegenstelle selbstständig Daten oder ob Du Daten anforderst!??

Zitat:
Das ist auch vollkommen egal, denn du entscheidest was davon wie angezeigt wird.
Ist nur halbrichtig, Steuerzeichen muss er selbst auswerten! Sie erscheinen ja nicht von ungefähr bei Schnittstellen, wenn sie dann Übertragen werden
Gruss alfold

Geändert von alfold ( 9. Mär 2011 um 20:28 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.152 Beiträge
 
Delphi 12 Athens
 
#9

AW: String wird bei bestimmetem Byte nicht angezeigt

  Alt 10. Mär 2011, 10:04
Sie erscheinen ja nicht von ungefähr bei Schnittstellen, wenn sie dann Übertragen werden
Gruss alfold
Sag ich ja.

Gut, ein Protokoll legt fest wie die Daten aufgebaut sind,
aber der Programmierer ist dann dafür verantwortlich die Daten notfalls umzukodieren, wenn die nachfolgenen Stellen (wie z.B. ein TMemo) mit diesesn Daten nicht klar kommt (es aber unbedingt dort angezeigt werden soll).

- Protokoll = Definition der Schnittstelle vom Gerät zu seinem Programm, also das Format der zu übertragenden Daten
- und die Schnittstelle zwischen dieser Schnittstelle und seiner Anzeige muß er sich nun selber schaffen.
> z.B. beim TMemo ist das grundlegende Protokoll, bzw. das Format des Textes festgelegt,
also müßte er nun quasi die Daten von Übertragungsprotokoll ins Anzeigeprotokoll umwandeln.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#10

AW: String wird bei bestimmetem Byte nicht angezeigt

  Alt 10. Mär 2011, 11:17
Nu mal langsam,
es sollte doch eigentlich klar sein, daß Daten aus "unbekannten" Quellen zunächst einmal nur Werte sind. Sie dann gleich als Buchstaben zu interpretieren ist zumindestens optimistisch.

Gruß
K-H
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:57 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz