PC要与一下位机通讯,别人公司给我们通讯协议关于CheckSum计算方式如下:
02H(不含)之后至CheckSum之前,所有Byte相加,取补数('0'...'9','A'...'F')示例:02H 51H [CheckSum 2B] 03H   CheckSum=41H 46H第一次接触R232通讯,请问这个CheckSum函数如何写?不胜感激!

解决方案 »

  1.   

    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;
      

  2.   

    to: jadeluo 
    原有示例:02H 51H [CheckSum 2B] 03H  CheckSum=41H 46H 
    意思是: 发送命令:51H, 其CheckSum为 41H 46H
    完整命令格式: 02H 51H 41H 46H 03H另有一比较长的范例:
    02H,4FH,20H,20H,20H,31H,20H,41H,31H,31H,30H,38H,37H,39H,30H,30H,31H,39H,31H,30H,30H,34H,39H,37H,30H,30H,31H,39H,31H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,20H,20H,20H,32H,20H,41H,32H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,20H,20H,20H,33H,20H,41H,33H,31H,30H,35H,35H,30H,30H,30H,32H,30H,30H,30H,30H,31H,35H,30H,30H,30H,32H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,20H,20H,20H,34H,42H,41H,31H,31H,30H,36H,30H,30H,30H,30H,32H,30H,30H,30H,30H,32H,30H,30H,30H,30H,32H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,20H,20H,20H,35H,42H,41H,31H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,30H,33H,32H,03H,
      

  3.   

    就拿示列:02H 51H [CheckSum 2B] 03H  CheckSum=41H 46H 来说,
    在函数function CheckSum(var Buffer; Size:Integer):Word; 中,参数Buffer,Size如何输入?不好意思,我是新手,请多指教!
      

  4.   


    你把02H之后到CheckSum之间的所有字节进行累加, 假设得到累加结果S, 则CheckSum := $100 - (S and $FF), 然后将CheckSum的高4位和低4位分别转换为十六进制字符填写到通讯包的CheckSum那两个字节中去。比如 02H 51H XX XX 03H,累加结果S等于$51, 按上面公式计算得到CheckSum为$AF, 所以CheckSum的2个字符的内容就分别是$41和$46,其中$41是字符A的ASCII码,$46是字符F的ASCII码。
      

  5.   


    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;
      

  6.   

    丿 + learning +  
      

  7.   

    多谢 jadeluo 这么详细的解说!