CheckSum算法
PC要与一下位机通讯,别人公司给我们通讯协议关于CheckSum计算方式如下:
02H(不含)之后至CheckSum之前,所有Byte相加,取补数('0'...'9','A'...'F')
示例:02H 51H [CheckSum 2B] 03H CheckSum=41H 46H
第一次接触R232通讯,请问这个CheckSum函数如何写?
不胜感激!
[解决办法]
function CheckSum(var Buffer; Size:Integer):Word;
type
TWordArray = array[0..1] of Word;
var
ChkSum : Longword;
i : Integer;
begin
ChkSum := 0; i := 0;
while Size>1 do begin
Inc(ChkSum,TWordArray(Buffer)[i]);
Inc(i);
Dec(Size,SizeOf(Word));
end;
if Size=1 then
Inc(ChkSum,Byte(TWordArray(Buffer)[i]));
ChkSum := (ChkSum shr 16) + (ChkSum and $FFFF);
Inc(ChkSum,(Chksum shr 16));
Result := Word(not ChkSum);
end;
[解决办法]
procedure CheckSum(var Buf; Size: Integer; var CheckSum1, CheckSum2: Byte);const HexChar : array[0..15] of Char = ('0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F');var i: Integer; s: Word; c: Byte;begin s := 0; for i := 0 to Size - 1 do s := (s + TByteArray(Buf)[i]) and $FF; c := $100 - s; CheckSum1 := ord(HexChar[c shr 4]); CheckSum2 := ord(HexChar[c and $0F]);end;var a : array[0..0] of Byte; c1, c2: Byte;begin a[0] := $51; CheckSum(a, 1, c1, c2); ShowMessage (IntToHex(c1, 2) + ',' + IntToHex(c2, 2));end;