Boa tarde a todos, depois de muita pesquisa aqui e na web solicito a ajuda dos colegas.
Estou precisando verificar o Checksum de um frame de comunicação.
Eu recebo a seguinte informação (byte):
(representação em hexa)
“01082D0516562A510CFF494C6A4B42410000000000000FC210304D20001D0C370008060E060500280700001F2500860781002213B404”
Bom a documentação (vaga) do protocolo me diz:
“O checksum compreende a soma em uma variável tipo byte de todos os caracteres desde o caracter posterir ao 01h, até o caracter imediatamente anterior ao checksum.O
checksum é sempre o caracter anterior ao 04h.”
01h = inicio do frame
04h = final do frame
Checksum = B4h
Entao tenho o código:
public class Teste1 {
public static void main(String[] args) {
short[] frame = { 0x01, 0x08, 0x2D, 0x05, 0x16, 0x56, 0x2A, 0x51, 0x0C,
0xFF, 0x49, 0x4C, 0x6A, 0x4B, 0x42, 0x41, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x0F, 0xC2, 0x10, 0x30, 0x4D, 0x20, 0x00,
0x1D, 0x0C, 0x37, 0x00, 0x08, 0x06, 0x0E, 0x06, 0x05, 0x00,
0x28, 0x07, 0x00, 0x00, 0x1F, 0x25, 0x00, 0x86, 0x07, 0x81,
0x00, 0x22, 0x13, 0xB4, 0x04 };
System.out.println(getCheckSum(frame));
}
public static short getCheckSum(short[] frame_) {
short retorno = 0;
boolean inicio = false;
for (short b : frame_) {
if (b == 0x01 && !inicio) {
inicio = true;
continue;
}
if (b == 0x00)
continue;
retorno += b;
if (b == 0x13)
break;
}
return retorno;
}
}
Bom o checksum deste pacote é o B4h em decimal = 180
Pelo código que fiz o resultado está sendo 1972, em hexa = 7B4
Tinha iniciado as rotinas utilizando byte[], e depois e pesquisar um pouco vi que o byte suporta -127 a 127. Então mudei para short.
Já quebrei a cabeça com isto e tendo em vista a pouca documentação e a falta de suporte do hardware gostaria de uma ajuda dos colegas.
Grato
Júnior