Registriert seit: 28. Mär 2009
73 Beiträge
Delphi XE6 Professional
|
Re: Binär Datei über RS232 versenden Delphi
11. Jul 2009, 18:09
Hab jetzt endlich wieder Zeit zum Delphi programmieren und hänge bei der CRC Berechnung.
Danke übrigens für den Tip Klaus CRC XModem ist die Lösung oder sollte sie sein.
Ich komme einfach nicht auf die Checksum die vom PComm Terminal errechnet wird.
Hier ein Auszug aus einem gesendeten Block:
01 01 FE 18 F0 9F E5 18 F0 9F E5 18 F0 9F E5 18 F0 9F E5 18 F0 9F E5 00 00 00 00 18 F0 9F E5 18 F0 9F E5 40 00 00 60 20 02 00 60 44 02 00 60 70 02 00 60 8C 02 00 60 00 00 00 00 8C 03 00 60 54 03 00 60 40 15 9F E5 B0 00 D1 E1 FF 00 80 E3 B0 00 C1 E1 B4 00 D1 E1 FF 00 80 E3 B4 00 C1 E1 B8 00 D1 E1 FF 00 80 E3 B8 00 C1 E1 1B 13 A0 E3 18 05 9F E5 B0 00 C1 E1 B4 00 C1 E1 10 05 9F E5 B8 00 C1 E1 F0 FC
01 01 FE = Ist die Initialisierung mit Begin eines Blockes(01), Block Nummer(01), Komplement der Block Nummer (FE)
F0 FC = Checksum CRC XModem
Bei mir kommt als Checksum immer nur 70D8 raus, was mach ich blos falsch?
Hier ein Auszug aus dem Code mit dem ich die Checksum berechne
Delphi-Quellcode:
function CalculateXYZModemCRC16(const Data; Length: LongWord): Word;
type
TCRC16Table = array[0..255] of Word;
TBytes = array[0..MaxInt - 1] of Byte;
const Crc16Tab: Array[0..$FF] of Word =
($00000, $01021, $02042, $03063, $04084, $050a5, $060c6, $070e7,
$08108, $09129, $0a14a, $0b16b, $0c18c, $0d1ad, $0e1ce, $0f1ef,
$01231, $00210, $03273, $02252, $052b5, $04294, $072f7, $062d6,
$09339, $08318, $0b37b, $0a35a, $0d3bd, $0c39c, $0f3ff, $0e3de,
$02462, $03443, $00420, $01401, $064e6, $074c7, $044a4, $05485,
$0a56a, $0b54b, $08528, $09509, $0e5ee, $0f5cf, $0c5ac, $0d58d,
$03653, $02672, $01611, $00630, $076d7, $066f6, $05695, $046b4,
$0b75b, $0a77a, $09719, $08738, $0f7df, $0e7fe, $0d79d, $0c7bc,
$048c4, $058e5, $06886, $078a7, $00840, $01861, $02802, $03823,
$0c9cc, $0d9ed, $0e98e, $0f9af, $08948, $09969, $0a90a, $0b92b,
$05af5, $04ad4, $07ab7, $06a96, $01a71, $00a50, $03a33, $02a12,
$0dbfd, $0cbdc, $0fbbf, $0eb9e, $09b79, $08b58, $0bb3b, $0ab1a,
$06ca6, $07c87, $04ce4, $05cc5, $02c22, $03c03, $00c60, $01c41,
$0edae, $0fd8f, $0cdec, $0ddcd, $0ad2a, $0bd0b, $08d68, $09d49,
$07e97, $06eb6, $05ed5, $04ef4, $03e13, $02e32, $01e51, $00e70,
$0ff9f, $0efbe, $0dfdd, $0cffc, $0bf1b, $0af3a, $09f59, $08f78,
$09188, $081a9, $0b1ca, $0a1eb, $0d10c, $0c12d, $0f14e, $0e16f,
$01080, $000a1, $030c2, $020e3, $05004, $04025, $07046, $06067,
$083b9, $09398, $0a3fb, $0b3da, $0c33d, $0d31c, $0e37f, $0f35e,
$002b1, $01290, $022f3, $032d2, $04235, $05214, $06277, $07256,
$0b5ea, $0a5cb, $095a8, $08589, $0f56e, $0e54f, $0d52c, $0c50d,
$034e2, $024c3, $014a0, $00481, $07466, $06447, $05424, $04405,
$0a7db, $0b7fa, $08799, $097b8, $0e75f, $0f77e, $0c71d, $0d73c,
$026d3, $036f2, $00691, $016b0, $06657, $07676, $04615, $05634,
$0d94c, $0c96d, $0f90e, $0e92f, $099c8, $089e9, $0b98a, $0a9ab,
$05844, $04865, $07806, $06827, $018c0, $008e1, $03882, $028a3,
$0cb7d, $0db5c, $0eb3f, $0fb1e, $08bf9, $09bd8, $0abbb, $0bb9a,
$04a75, $05a54, $06a37, $07a16, $00af1, $01ad0, $02ab3, $03a92,
$0fd2e, $0ed0f, $0dd6c, $0cd4d, $0bdaa, $0ad8b, $09de8, $08dc9,
$07c26, $06c07, $05c64, $04c45, $03ca2, $02c83, $01ce0, $00cc1,
$0ef1f, $0ff3e, $0cf5d, $0df7c, $0af9b, $0bfba, $08fd9, $09ff8,
$06e17, $07e36, $04e55, $05e74, $02e93, $03eb2, $00ed1, $01ef0);
var
CRC16: word;
index: byte;
i:LongWord;
begin
CRC16 := 0; // $FFFF
for i:=0 to Length-1 do
begin
index := ((CRC16 shr 8) xor TBytes(Data)[i]) and $FF;
CRC16 := CRC16Tab[Index] xor (CRC16 shl 8);
end;
Result := CRC16;
end;
Jan Ein neuer Tag bringt so einiges mit sich. Was auch immer es ist, es bleibt ein kleines Abenteuer.
|