通过串口调试工具分别读到以下五条数据,其中(30,31,32,33,34)是比较有规律的递增的,但是(81,80,83,82,85)毫无规律,不知道是怎么计算出来的,请大侠帮忙,万分感谢!FA 80 31 30 30 30 34 05 00 01 30 81 FC
FA 80 31 30 30 30 34 05 00 01 31 80 FC 
FA 80 31 30 30 30 34 05 00 01 32 83 FC
FA 80 31 30 30 30 34 05 00 01 33 82 FC
FA 80 31 30 30 30 34 05 00 01 34 85 FC 

解决方案 »

  1.   

    是自定义通讯协议?还是通用协议?串口通信用的比较多的是CRC16和累加和校验
      

  2.   

    应该是CRC,但是倒推协议难度有点大~~~~
      

  3.   

    不清楚是什么样的通讯协议,CRC有很多种协议吗?如有很多,请用通用的帮忙我解释一下,CRC16具体是怎么算出来的啊,非常感谢!
      

  4.   

    给你贴个曾用过的CRC16算法例子看看吧///////////////////////////////////////////////////////////
    // 16位CRC:按位计算,速度最慢,占用空间最少
    // 注:数据流是高位先行
    ///////////////////////////////////////////////////////////
    function CalCRC16(data, crc, genpoly: Word): Word;
    var i: Integer;
    begin
      // 方法1:摘自XMODEM协议
      crc := crc xor data;//(data shl 8);
      for i:=0 to 7 do
        if (crc and $0001) <> 0 then // 只测试最高位
          crc := (crc shr 1) xor genpoly // 最高位为1,移位和异或处理
        else crc := crc shr 1;           // 否则只移位(乘2)
      Result := crc;
    {
      // 方法2:算法有些不同,但结果相同
      data := data shl 8; // 移到高字节
      for i:=7 downto 0 do
      begin
        if ((data xor crc) and $8000) <> 0 then // 只测试最高位
          crc := (crc shl 1) xor genpoly // 最高位为1,移位和异或处理
        else crc := crc shl 1;           // 否则只移位(乘2)
        data := data shl 1; // 处理下一位
      end;
      Result := crc;  // 方法3:摘自<<CRC算法原理及C语言实现>>
      for i:=7 downto 0 do
      begin
        if (crc and $8000) <> 0 then
          crc := (crc*2) xor genpoly // 余式CRC乘以2再求CRC
        else crc := crc*2;
        if (data and (1 shl i)) <> 0 then
          crc := crc xor genpoly; // 再加上本位的CRC
      end;
      Result := crc;
    }
      

  5.   

    多谢大家的回复
    请大侠给给一下c++ builder能直接用的代码啊,万分感谢!
    最好能将数据 FA 80 31 30 30 30 34 05 00 01 30 81 FC ,中的红色81直接算出来,其他数据也通过该算法得出,多谢!多谢!
      

  6.   


    在C++ builder中直接编译pas文件生成hpp就可以了。
      

  7.   

    异或校验,将要校验的所有字节时行一次异或就可以了,代码标非常简单我就不写了。验证方式:
    打开Win7计算器,设置成程序员模式,显示为字节。复制下行到计算器就得得到结果
    80^31^30^30^30^34^05^00^01^31=
      

  8.   

    FA 80 31 30 30 30 34 05 00 01 30 81 FC
     FA 80 31 30 30 30 34 05 00 01 31 80 FC 
     FA 80 31 30 30 30 34 05 00 01 32 83 FC
     FA 80 31 30 30 30 34 05 00 01 33 82 FC
     FA 80 31 30 30 30 34 05 00 01 34 85 FC  FA 80 31 30 30 30 34 05 00 01 35 84 FC==>? FA 80 31 30 30 30 34 05 00 01 36 87 FC==>
     FA 80 31 30 30 30 34 05 00 01 37 86 FC==>
      

  9.   

    crc校验有一个自定义的种子码。各家都不一样,比如hongss贴出的代码中的 genpoly,就是一个种子码。算法基本上是一样的,但前提是你必须知道种子码是多少。
    所以别人是无法给你直接算出结果的