Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Char nach BCD konvertieren? (https://www.delphipraxis.net/45106-char-nach-bcd-konvertieren.html)

dragi 29. Apr 2005 18:36


Char nach BCD konvertieren?
 
Hallo,

Wie in einem Thread weiter unten schon erwähnt lese ich Daten aus meiner Wetterstation über RS232 aus. Ich bekomme von meiner Wetterstation 6 Byte in denen Werte im BCD Format vorliegen. Diese 6 Byte lese ich in ein array of Char weil mit Async Pro die Methode GetChar zur Verfügung stellt. Wie kann ich denn nun die einzelnen Chars konvertieren? Muss ich die nicht von Char nach BCD und von BCD nach Integer konvertieren? Es muss eine Zahl am Ende rauskommen.

So sieht mein Code aus. Es sollen 6 Byte zurückkommen aus denen sich uhrzeit und Datum dastellen lassen;

Code:
procedure TForm1.ComPortTriggerAvail(CP: TObject; Count: Word);
var
  i, j, Temp: Integer;
  test: array of Char;
begin
  SetLength(Test,Count);
  for i := 1 to count do
    test[i - 1] := ComPort.GetChar;
  for j := 0 to length(test) - 1 do
  begin
    Temp := BCDToInteger(StrToBcd(Test[j]), True); // <----Hier kommt der Fehler direkt beim ersten Durchlauf der Schleife:
    List.Add(IntToStr(Temp));                     //      ... ist kein gültiger BCD-Wert! ...ist ein kleines Viereck,
  end;                                            //      also ein nicht druckbares Zeichen denke ich
  List.SaveToFile(ExtractFilePath(ParamStr(0))+ 'temp.txt');
end;
Hat jemand eine Idee?

Vielen Dank

Dragi

Robert Marquardt 30. Apr 2005 05:51

Re: Char nach BCD konvertieren?
 
BCD heisst das in jedem Byte zwei Dezimalziffern untergebracht sind.
Je vier Bit (ein Nibble) enthalten die Werte 0..9.
Delphi-Quellcode:
var
  Value: Integer; // Zielwert
  Source: array [0..5] of Byte; // Beispiel fuer die BCD Bytes
  I: Integer;
begin
  Value := 0;
  for I := 0 to 5 do
  begin
    Value := Value * 10; // eine Ziffer links schieben
    // oberes Nibble rausknipsen
    Value := Value + Integer((Source[I] shr 4) and $F);
    Value := Value * 10; // eine Ziffer links schieben
    // unteres Nibble rausknipsen
    Value := Value + Integer(Source[I] and $F);
  end;
end;
Alles ohne Gewaehr, da hier eingetippt.
Es kann auch sein das du die Ziffern in umgekehrter Reihenfolge bekommst. Das muss man aus der Doku lesen oder ausprobieren.

dragi 30. Apr 2005 18:06

Re: Char nach BCD konvertieren?
 
Vielen Dank für den Code. Werde den ausprobieren sobald ich die Verbindung über RS232 hinkriege...aber das steht in einem anderen Thread :)

Gruss

Dragi


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