Calcular CheckSum

Delphi

07/11/2003

Salve galera!

Preciso fazer um checksum como abaixo:

A sequencia abaixo é enviada pela serial pelo aplicativo(sem os espaços


SOH 000096 STX 0* S ETX BCC

Convertendo fica

#01´000096´02´0*S´03BCC

onde BCC é o CheckSum com dois bytes

A maneira de obter o cheksum é:

Cálculo do primeiro byte (BCC1):
SOH -> 01 HEX
0 -> 30 HEX
0 -> 30 HEX
0 -> 30 HEX
0 -> 30 HEX
9 -> 39 HEX
6 -> 36 HEX
STX -> 02 HEX
0 -> 30 HEX
* -> 2A HEX
S -> 53 HEX
ETX -> 03 HEX
------------
SOMA -> 1E2 HEX
SOMA TRUNCADA -> E2 HEX
COMPLEMENTO -> 1D HEX
COMP. DE DOIS -> 1E HEX (complemento mais 01 HEX) = BCC1

Cálculo do segundo byte (BCC2):
OU EXCLUSIVO de todos os bytes (de SOH a ETX) -> 46 HEX = BCC2

Como faço para varrer a sequencia, converter para hexa e calcular, e montar o check sum?


Koplin

Koplin

Curtidas 0

Respostas

Marcelo Saviski

Marcelo Saviski

07/11/2003

deixa eu ver se eu entendi para poder ajudar:

os valores para SOH 000096 STX 0* S ETX BCC

SOH = 01 HEX
0 = 30 HEX
STX = 02 HEX

são valores constantes?
eria como uma máscara para esses valores?


GOSTEI 0
Koplin

Koplin

07/11/2003

#01´000096´02´0*S´03
a conversão SOH para 01, ETX para 03 é fácil
meu problema é
01 para hexa
0 para hexa
0 para hexa
0 para hexa
0 para hexa
9 para hexa
6 para hexa
02 para hexa
´0´ para Hexa
´*´ para hexa

...


e somar tudo como no ex


GOSTEI 0
Beppe

Beppe

07/11/2003

Assumindo que sua sequência está numa string, tome nota:

procedure CheckSumA(const Data: String; out BCC1, BCC2: Byte);
var
  I: Integer;
begin
  BCC1 := 0;
  BCC2 := 0;
  for I := 1 to Length(Data) do
  begin
    Inc(BCC1, Ord(Data[I]));
    BCC2 := BCC2 xor Ord(Data[I]);
  end;
  BCC1 := -BCC1;
end;


Desative range checks e overflow.

Ataliba


GOSTEI 0
Koplin

Koplin

07/11/2003

Resposta simples objetiva e em cima da pinta!

Brigadão!

Ainda falta esta plaquinha ai embaixo mostrar a cor da minha meia!(risos)


GOSTEI 0
POSTAR