我正在通过Android中的串口与设备通信。 我得到的结果是:
01H 50H 30H 02H 28H 34H 45H 38H 39H 42H 42H 41H 43H 29H 03H 48H
最后的十六进制代码,即: 48H 是阻止检查字符(BCC)。
根据文档,它说BCC是从第二个字节到最后一个字节的校验和字节而不是一个字节。
我厌倦了以下方法获得BCC,但它给了我38H,它与设备输出不匹配。
byte[] inputByteArray = {0x50,0x30,0x02,0x28,0x34,0x45,0x38,0x39,0x42,0x42,0x41,0x43,0x29,0x03};
int sum = 0;
for (byte b : inputByteArray) {
sum = (sum + b) & 0xFF;
}
int compliment = (sum ^ 0xFF);
int adding1 = compliment + 1;
sum = (((sum ^ 0xFF) + 1) & 0xFF);
我无法弄清楚它是如何根据设备的给定十六进制输出计算出来的。 我需要找到逻辑,因为我需要计算下一个请求的其他BCC值。
任何形式的帮助都会受到赞赏。
答案 0 :(得分:0)
首先得到数组中所有字节的总和
byte[] inputByteArray =
{0x50,0x30,0x02,0x28,0x34,0x45,0x38,0x39,0x42,0x42,0x41,0x43,0x29,0x03};
int sumByte = 0;
for (int x = 1; x < inputByteArray .length; x++) {
sumByte += inputByteArray [x];
}
//sumByte = 712
计算BCC的方法
public int getBCCbyte(int sumByte){
double BCCInDouble = 0;
int ToFindBCC = sumByte;
//Get the Binary String of the SUM
String binary = Integer.toBinaryString(ToFindBCC);//(1011001000)
String finalBinaryBCC = binary.substring(binary.length() - 7);//(1001000)
//Convert the binary String to char array and calculate the decimal value
char[] binaryList = finalBinaryBCC.toCharArray();//[1,0,0,1,0,0,0]
for (int k = 0; k <= 6; k++) {
if (binaryList[k] == '1') {
BCCInDouble += Math.pow(2, 6 - k);
}
}
return (int) BCCInDouble;//72
}
这里72是48H的十进制值。
希望这对其他人有所帮助。