Alles OK. Es funktioniert jetzt auch in meiner Anwendung.
Ganz so einfach ist das ganze dann aber doch nicht, das Protokoll (von 1984 glaube ich) doch etwas umständlich ist. Heute würde ich das etwas anders machen.
Hier mal der Code, mit dem ich das gesamte "DataFile" für Filetype 11 zusammenbaue.
Delphi-Quellcode:
procedure EncodeBDVMoney(Value: Real);
var
cDigits: String;
lData: array[0..7] of Byte;
n: Byte;
CheckSum: Byte;
begin
// Hier wird der Preis als 5 Digits übergeben
FMessageList := FMessageList + AcceptBlockChar; //3Dh
lData[0] := 129; // 1000 0001 - Low Nibble 0001 = Receiving Pripheral ident, 001 = VMC
// - High Nibble 1000 = Transmitting Pripheral ident, 1000 = Master
lData[1] := 10; // 0000 1010 - Datafile length in Bytes
lData[2] := 11; // 0000 1011 - Filetype Identification Number = Filetype 11
// Wenn z.B. 20 Cent (€ 0,20) eingeworfen sind, dann soll das herauskommen 00020
cDigits := StrRight( '00000' + IntToStr(Round(Value * 100)), 5);
lData[3] := (StrToInt(cDigits[4]) shl 4) or StrToInt(cDigits[5]); // Digit 2 + Digit 1
lData[4] := (StrToInt(cDigits[2]) shl 4) or StrToInt(cDigits[3]); // Digit 4 + Digit 3
// ExactChangeFlag + Dezimal Point Position
if FExactChangeFlag then begin
lData[5] := (11 shl 4) or StrToInt(cDigits[1]); // 11 = 1011 + Digit 5
end else begin
lData[5] := (3 shl 4) or StrToInt(cDigits[1]);; // 3 = 0011 + Digit 5
end;
// immer fest auf 5 Cent
lData[6] := 5; // 0000 0101 Lowest Coin Real Currency Value BCD Digits 1 + 0
lData[7] := 0; // 0000 0000 Lowest Coin Real Currency Value BCD Digits 3 + 2
CheckSum := CalcChecksum(@lData[0], 8);
// PID = Peripheral Identifier = $20
for n := 0 to 7 do begin
FMessageList := FMessageList + chr( PID + (lData[n] and 15)); // + Low Nibble - Fh
FMessageList := FMessageList + chr( PID + ((lData[n] and 240) shr 4)); // + High Nibble - F0f
end;
FMessageList := FMessageList + chr(PID + (CheckSum and 15));
FMessageList := FMessageList + chr(PID + 0);
FMessageList := FMessageList + chr(PID + 0);
FMessageList := FMessageList + chr(PID + ((CheckSum and 240) shr 4));
FMessageList := FMessageList + DataSyncChar; //39h
end;
Nochmals vielen Dank an Dich Muetze1. Ich habe zwar Deine Funktion noch nicht ganz verstanden, aber das versuche ich noch mal, wenn ich etwas klarer im Kopf bin. Heute mache ich da jetzt nichts mehr dran, am Montag geht es damit weiter.
Grüße
Sven