Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Serieller Datenempfang Byte-Probleme (https://www.delphipraxis.net/212850-serieller-datenempfang-byte-probleme.html)

skoschke 13. Apr 2023 07:40

Serieller Datenempfang Byte-Probleme
 
Hallo,

ich bin an einer App welche über einen optischen Tastkopf und FTDI-Chip Daten aus einem elektronischen Zähler auslesen soll.
Das verwendete Protokoll ist SML, aber das nur nebenbei...

Da die Auswertung nicht so läuft wie erwartet, habe ich mir mal eine Funktion gebastelt, welche die empfangenen Daten in hexadezimaler Form in eine Textdatei schreibt.

Und hier fällt nun sofort auf, dass da was nicht stimmen kann:

Zitat:

77
07 01 00 02 08 00 FF
01
72
62 01
65 00 2F 69 CD
62 1E
52 FF
69 00 00 00 00 00 02 20AC 36
01
Da über den seriellen Port eigentlich nur Bytes (0...FF) kommen können, woher kommt da das "20AC"?

Hat jemand eine Idee, was da schief läuft? Die empfangenen Daten werden in einem String gespeichert...

Ciao
Stefan

EmWieMichael 13. Apr 2023 07:51

AW: Serieller Datenempfang Byte-Probleme
 
Zeig doch mal die "gebastelete" Funktion.
Ist Dir aufgefallen, dass es sich um das erste Leerzeichen handelt?

skoschke 13. Apr 2023 08:29

AW: Serieller Datenempfang Byte-Probleme
 
Nein, daran lag es nicht!

Hier der Datenempfang:

Delphi-Quellcode:
procedure TFormMain.OnReceivedData(Data: TArray<Byte>);
begin
  CallInUIThread(
    procedure
    begin
      try
         completebuffer := completebuffer + TEncoding.ANSI.GetString(Data);
      except
        on e: Exception do
          showmessage('Exception: ' + e.Message);
      end
    end);
Das Verarbeiten des Bytearrays (hinzufügen zu completebuffer) machte die Daten kaputt!

Jetzt habe ich die Bytes mal "manuell kopiert":

Delphi-Quellcode:
procedure TFormMain.OnReceivedData(Data: TArray<Byte>);
begin
  CallInUIThread(
    procedure
    var
      empfangen: string;
      i: integer;
    begin
      try
        empfangen := '';
        for i := Low(Data) to High(Data) do
          empfangen := empfangen + chr(Data[i]);
        completebuffer := completebuffer + empfangen;
      except
        on e: Exception do
          showmessage('Exception: ' + e.Message);
      end
    end);
Und damit scheint es zu funktionieren :-)

Ciao
Stefan

peterbelow 13. Apr 2023 13:39

AW: Serieller Datenempfang Byte-Probleme
 
Die Wurzel des Problems ist (mal wieder) der Mißbrauch eines Strings zum speichern von Daten, die keine Zeichen sind. Das ging noch so einigermaßen gut als String = Ansistring und Sizeof(char) = Sizeof(byte) waren, aber seit String = Unicodestring ist hat man da ein Minenfeld zu überqueren...

Uwe Raabe 13. Apr 2023 14:20

AW: Serieller Datenempfang Byte-Probleme
 
Zitat:

Zitat von peterbelow (Beitrag 1520980)
hat man da ein Minenfeld zu überqueren...

Oder man läuft gleich drum herum...

skoschke 15. Apr 2023 08:40

AW: Serieller Datenempfang Byte-Probleme
 
Zitat:

der Mißbrauch eines Strings zum speichern von Daten, die keine Zeichen sind
Ihr habt ja Recht :-)

Ciao
Stefan


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:23 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