一个通讯文档上说,
  校验值:
  数据长度到校验值前一个字节的累加和  示例数据:
     00 52 是数据长度
  AA 00 52 01 02 00 00 03 09 36 04 06 70 00 00 00 01 41 1D 00 01 02 47 41 37 28 43 29 45 4D 33 31 30 2D 47 4B 20 42 57 3A 31 2E 30 30 20 48 57 3A 31 2E 30 30 20 53 57 3A 31 2E 30 39 20 49 4D 53 49 3A 34 36 30 30 33 30 39 33 36 30 34 30 36 37 30 00 8D AA 
                     8D 是校验值
   
   再来几组数据:
   AA 00 52 01 02 00 00 03 09 36 04 06 70 00 00 00 00 41 1D 00 01 02 47 41 37 28 43 29 45 4D 33 31 30 2D 47 4B 20 42 57 3A 31 2E 30 30 20 48 57 3A 31 2E 30 30 20 53 57 3A 31 2E 30 39 20 49 4D 53 49 3A 34 36 30 30 33 30 39 33 36 30 34 30 36 37 30 00 8C AA 
   AA 00 52 01 02 00 00 03 09 36 04 06 70 00 00 00 01 41 1D 00 01 02 47 41 37 28 43 29 45 4D 33 31 30 2D 47 4B 20 42 57 3A 31 2E 30 30 20 48 57 3A 31 2E 30 30 20 53 57 3A 31 2E 30 39 20 49 4D 53 49 3A 34 36 30 30 33 30 39 33 36 30 34 30 36 37 30 00 8D AA 
   AA 00 52 01 02 00 00 03 09 36 04 06 70 00 00 00 02 41 1D 00 01 02 47 41 37 28 43 29 45 4D 33 31 30 2D 47 4B 20 42 57 3A 31 2E 30 30 20 48 57 3A 31 2E 30 30 20 53 57 3A 31 2E 30 39 20 49 4D 53 49 3A 34 36 30 30 33 30 39 33 36 30 34 30 36 37 30 00 8E AA 
   AA 00 52 01 02 00 00 03 09 36 04 06 70 00 00 00 03 41 1D 00 01 02 47 41 37 28 43 29 45 4D 33 31 30 2D 47 4B 20 42 57 3A 31 2E 30 30 20 48 57 3A 31 2E 30 30 20 53 57 3A 31 2E 30 39 20 49 4D 53 49 3A 34 36 30 30 33 30 39 33 36 30 34 30 36 37 30 00 8F AA 求解

解决方案 »

  1.   

    AA 00 52 [01 02 ......30 00] 8D AA 
    方括号里的16进制数按位与,正好是10进制82,也就是16进制52
      

  2.   

    AA 是头  00 52 是数据长度 
    最后的 8D 这个才是校验 
    要校验出8D
      

  3.   

    累加不进位校验和算法? /// <summary>
            /// 计算累加校验和
            /// </summary>
            /// <param name="SendByteArray">要校验的字节数组</param>
            /// <returns>对字节数组进行校验所得到的校验和</returns>
            public static byte GetCS(byte[] SendByteArray)
            {
                byte rst = 0x00;
                //int i = 0;
                //计算累加和
                for (int j = 2; j < SendByteArray.Length; j++)
                {
                    unchecked
                    {
                        rst += SendByteArray[j];
                    }
                }
                //累加和计算结束
                return rst;
            }
      

  4.   

    总长度 84
    ============头
    AA 数据头
    00 52 - 数据长度 82
    01 版本号
    02 协议代码
    00 00 03 09 36 04 06 70 终端ID
    00 00 00 01 数据包序号
    ============数据
    41 协议帧长度 65  84-65=19 尾巴 2位 前面 16位 不包含本位1D 协议值
    00 01 标志值
    数据内容02 定时心跳============未知
    47 41 37 28 43 29 45 4D 33 31 30 2D 47 4B 20 42 57 3A 31 2E 30 30 20 48 57 3A 31 2E 30 30 20 53 57 3A 31 2E 30 39 20 49 4D 53 49 3A 34 36 30 30 33 30 39 33 36 30 34 30 36 37 30 00 ============尾巴
    8D 校验
    AA 数据尾巴 附加个手动解析过程 问题是校验 位 怎么出来
      

  5.   

    BW:1.00 HW:1.00 SW:1.09 IMSI:46003093604670是个什么玩意?
      

  6.   

    从UE看:
    ?R   6p   A GA7(C)EM310-GK BW:1.00 HW:1.00 SW:1.09 IMSI:46003093604670 崻
      

  7.   

    ===============================
    AA 00 52 01 02 00 00 03 09 36 04 06 70 00 00 00 00 41 1D 00 01 02 47 41 37 28 43 29 45 4D 33 31 30 2D 47 4B 20 42 57 3A 31 2E 30 30 20 48 57 3A 31 2E 30 30 20 53 57 3A 31 2E 30 39 20 49 4D 53 49 3A 34 36 30 30 33 30 39 33 36 30 34 30 36 37 30 00 8C AA 
    ===============================
      AA 00 52 01 02 00 00 03 09 36 04 06 70 00 00 00 01 41 1D 00 01 02 47 41 37 28 43 29 45 4D 33 31 30 2D 47 4B 20 42 57 3A 31 2E 30 30 20 48 57 3A 31 2E 30 30 20 53 57 3A 31 2E 30 39 20 49 4D 53 49 3A 34 36 30 30 33 30 39 33 36 30 34 30 36 37 30 00 8D AA  
    第二包数据比第一包数据的校验和小1,因为在第二包中有:0x01,而对应的第一包中的位置是0x00。估计很可能是累加和校验。楼主用我上面发的函数校验了没?
      

  8.   

    感谢 walkghost 。。
    我也发现这个问题,同时也编写过几乎一样的代码,
    问题是,有几个数据会校验正确,大部分都校验失败。 
    这一点还是比较郁闷的。
      

  9.   

    1 普通串口通讯的报文码
    2 解释:
      AA 00 52 01 02 00 00 03 09 36 04 06 70 00 00 00 01 41 1D 00 01 02 47 41 37 28 43 29 45 4D 33 31 30 2D 47 4B 20 42 57 3A 31 2E 30 30 20 48 57 3A 31 2E 30 30 20 53 57 3A 31 2E 30 39 20 49 4D 53 49 3A 34 36 30 30 33 30 39 33 36 30 34 30 36 37 30 00 8D AA  
      AA是报头和报尾,一般报头和报尾是不同的比较好
       00 52  是长度
       
       就是说你的倒数第二个位是校验位,校验方法求算术和,这个很常见见,也有异或和或者其它的
        一般校验位就是除去报头和报尾的,你在接受的时候碰到报头开始计算检验,在你指定长度的位中如果校验与实际接收不符合就当错误侦处理咯.
        后面几帧一样啊,你从00 52开始计算校验,如果倒数第二个位与你计算的不一致,就说明下位机命令码错误.