![]() |
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. |
AW: Umkonvertieren von hex Daten und in Variablen speichern.
ReplaceStr und alle '0x' entfernen, sowie alle Leerzeichen,
dann ![]() 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: |
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:
Das Ergebnis wäre dann wie folgt:
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.
Code:
Header : 43605 = $AA55
Kanal : 1 = $01 Befehl : 130 = $82 Status : 16 = $10 Wert : 660357 = $000A1385 |
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 |
AW: Umkonvertieren von hex Daten und in Variablen speichern.
packed? Alignment?
|
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:
Alles, was feste, sowie. externe Strukturen referenziert, sollte besser immer fest/statisch/unveränderlich Deklariert werden,
type
TMyRec = packed record ... end; außer dort wurde explizit etwas dynamisch definiert, also nicht nur Alignemt, sondern auch Integer (16, 32, 64 Bit), Char (ANSI oder Unicode) usw. |
AW: Umkonvertieren von hex Daten und in Variablen speichern.
Vielen Dank, damit kann ich super arbeiten.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:18 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz