读书人

CheckSum算法解决方案

发布时间: 2012-05-04 12:36:09 作者: rapoo

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;
[解决办法]

Delphi(Pascal) code
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; 

读书人网 >.NET

热点推荐