Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Umkonvertieren von hex Daten und in Variablen speichern. (https://www.delphipraxis.net/213563-umkonvertieren-von-hex-daten-und-variablen-speichern.html)

Graw 18. Aug 2023 09:55

Umkonvertieren von hex Daten und in Variablen speichern.
 
Hallo,

ich bekomme über eine serielle Schnittstelle 8 Byte und muss diese umkonvertieren und weiterverarbeiten.
Hier hänge ich nun leider fest.

Beispiel:

Folgendes bekomme ich über die serielle Schnittstelle:
0x55 0xAA 0x01 0x82 0x85 0x13 0x1A 0xF0

Folgende Daten sind enthalten:
Header: 0x55 0xAA
Kanal: 0x01
Befehl: 0x82
Wert inklusive Status: 0x85 0x13 0x1A
Checksumme: 0xF0

In der Prozedur OnRxChar würde ich gerne überprüfen ob der Header passend ist, den Kanal in einer Variable einlesen (0 bis 128) und der Wert inklusive Status muss in zwei Variablen.
0x85 0x13 0x1A ergibt: 0xA1385 = 660357 , Status: 0x10

Ich stehe bei dem umkonvertieren und passend ausschneiden auf dem Schlauch.

Könnt ihr mir da helfen :)

Vielen Dank.

himitsu 18. Aug 2023 11:54

AW: Umkonvertieren von hex Daten und in Variablen speichern.
 
ReplaceStr und alle '0x' entfernen, sowie alle Leerzeichen,
dann Delphi-Referenz durchsuchenHexToBin, z.B. in ein TBytes (oder einen AnsiString, RawByteString, AnsiChar-Array, Byte-Array, ...),
und dann vielleicht TEncoding.ANSI.GetString oder Dergleichen.

Ich glaub es gab irgendwo auch ein Stream-Klasse für Hexadezimal ... da müsste mal wer die Hilfe fragen :angle:

arcticwolf 18. Aug 2023 13:00

AW: Umkonvertieren von hex Daten und in Variablen speichern.
 
Ich würde das mit einem Record lösen in welches die Daten von der seriellen Schnittstelle geschrieben oder kopiert werden.

Delphi-Quellcode:
program SerialData;

{$APPTYPE CONSOLE}

uses
  System.SysUtils;

Const Data : Array [0..7] of Byte = ($55, $AA, $01, $82, $85, $13, $1A, $F0);

Type tMyRec = Record
     private
       Header : Word;
       Kanal : Byte;
       Befehl : Byte;
       Data : Array [1..4] of Byte;
     public
       Function Wert : Integer;
       Function Status : Byte;
     End;

Var MyRec : tMyRec;

function tMyRec.Status: Byte;
begin
  Result := (Data[3] div 16) shl 4;
end;

function tMyRec.Wert: Integer;
Var Value : Word;
begin
  Result := ((Data[3] mod 16) shl 16)
          + (Data[2] shl 8)
          + Data[1];
end;

begin
  Move(Data[0], MyRec, 8);
  Writeln('Header : ',MyRec.Header:6,' = $',MyRec.Header.ToHexString);
  Writeln('Kanal : ',MyRec.Kanal:6 ,' = $',MyRec.Kanal.ToHexString);
  Writeln('Befehl : ',MyRec.Befehl:6,' = $',MyRec.Befehl.ToHexString);
  Writeln('Status : ',MyRec.Status:6,' = $',MyRec.Status.ToHexString);
  Writeln('Wert  : ',MyRec.Wert:6  ,' = $',MyRec.Wert.ToHexString);
  Readln;
end.
Das Ergebnis wäre dann wie folgt:

Code:
Header : 43605 = $AA55
Kanal :     1 = $01
Befehl :   130 = $82
Status :    16 = $10
Wert  : 660357 = $000A1385

paule32.jk 19. Aug 2023 13:33

AW: Umkonvertieren von hex Daten und in Variablen speichern.
 
Hey, tolle Lösung !!!
kann man hier im Forum nicht irgendwie die Threads zu Themen im Benutzerbereich speichern,
um ggf. später zurückgreifen zu können ?
wäre auch ein tolles Features für dieses Board.

Gruß, paule32

Redeemer 21. Aug 2023 08:21

AW: Umkonvertieren von hex Daten und in Variablen speichern.
 
packed? Alignment?

himitsu 21. Aug 2023 10:43

AW: Umkonvertieren von hex Daten und in Variablen speichern.
 
Gut, in diesem Fall ändert ein packed Record nichts, da es quai schon Packed ist, weil "Byte" bereits an der kleinst möglichen Grenze ausgerichtet wurde.

Aber vor allem für neue Delphi-Upgrades oder einen Umstieg auf Win64 oder eine andere Platform,
ist das für "statische" Daten immer angebracht, damit nicht durch ein geändertes Alignment dieses Record geändert und somit nicht mehr zu den Daten passen könnte.

Delphi-Quellcode:
type
  TMyRec = packed record
    ...
  end;
Alles, was feste, sowie. externe Strukturen referenziert, sollte besser immer fest/statisch/unveränderlich Deklariert werden,
außer dort wurde explizit etwas dynamisch definiert,
also nicht nur Alignemt, sondern auch Integer (16, 32, 64 Bit), Char (ANSI oder Unicode) usw.

Graw 24. Aug 2023 13:40

AW: Umkonvertieren von hex Daten und in Variablen speichern.
 
Vielen Dank, damit kann ich super arbeiten.


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