串口的数据包格式:数据包组成: 包头+消息体+包尾包头和包尾 固定不用管消息体由几个字段组成 :  Length + COM + Data + Check 消息体字段说明:名称 长度 说明
Length 1 长度,COM+ Data 字节数
COM 1 命令码
Data x 数据,与命令相关
Check 1 校验和,Length+ COM+ Data 所有字节累加和的补码样例: 03+21+01+01+DA 
长度=3 ,命令=21,数据=1 , 1 ,校验和=DA
这个 校验和 DA 是怎么算出来的?
用Java如何实现啊?
急急急急急急啊!在线等,各位高手请指教啊

解决方案 »

  1.   

    03+21+01+01 全部是16进制  累加26--> 0010 0110 -->补码 1101 1001 -->DA 
      

  2.   

    那为什么 01H+01H+0FEH (长度=1,命令=1,校验和=FE)
    ?FE是怎么算出来的啊?
      

  3.   

    01+01  02 0000 0010 --> 1111 1101 FE
      

  4.   

    sorry,我以上的解答全是错的,略过......按我算得分别是D9和FD
      

  5.   

    /**
     * d1 与 d2 进行异或运算
     * @param d1
     * @param d2
     * @return
     */
    private static byte xor(byte d1,byte d2){
    int temp = d1 ^ d2;
    return (byte)temp;
    }

    /**
     * 进行异或校验
     * @param data
     * @return
     */
    public final static byte xor(byte[] data){
    return xor(data,0,data.length - 1);
    }

    /**
     * 校验数组部分数据
     * beginIndex和endIndex都是从下标为0开始
     * @param data
     * @param beginIndex
     * @param endIndex
     * @return
     */
    public final static byte xor(byte[] data,int beginIndex,int endIndex){
    if(null == data || data.length == 0)
    return 0x00;
    byte b1 = data[beginIndex];
    //System.out.println("byte #" + beginIndex + " : " + data[beginIndex] + "    b1 : " + b1);
    for(int i = beginIndex + 1;i < endIndex + 1;i++){
    b1 = xor(b1,data[i]);
    //System.out.println("byte #" + i + " : " + data[i] + "    b1 : " + b1);
    }
    return b1;
    }
    //将你的数据转成一个Byte[]之后 就OK