Sou um programador e preciso enviar dados para a máquina, mas preciso adicionar a soma de verificação no final dos dados . Alguém pode me mostrar um exemplo de como fazer isso para que eu pudesse escrever um programa para calcular a soma de verificação para mim.

As regras: inversão bit a bit da soma de 1 byte de bytes começando com o byte de endereço mais significativo e terminando com o byte que precede a soma de verificação. (Para realizar uma inversão bit a bit, “OR exclusivo” a soma de um byte com hex FF.)

Obrigado

Comentários

  • O que isso tem a ver com a tag: eletrônica de potência?

Resposta

A definição muito bem cobre isso.

Inversão bit a bit da soma de 1 byte de bytes começando com o byte de endereço mais significativo e terminando com o byte que precede a soma de verificação. (Para realizar uma inversão bit a bit, “OR exclusivo” a soma de um byte com hex FF.)

Exemplo

  • Mensagem “Hello” = Hex: 48 65 6C 6C 6F.
  • Adicionando isso usando meu Windows Calc.exe no modo Programador, obtenho & h01F4.
  • Pegue o último byte e ignore todo o resto: & hF4.
  • & hF4 XOR & hFF = & h0B – sua soma de verificação.

Para esclarecer o último bit:

&hF4 = 1111 0100 &hFF = 1111 1111 --------- XOR = 0000 1011 = &h0B 

Atualizar

Por algum motivo, não funciona para mim. Aqui eu tenho CA 00 01 70 00, eu somo para obter 13B, eu pego o último byte que é 3B e XOR com FF, então eu obtenho c4, que é diferente de 8E (um exemplo que peguei no manual). Perdi algo sobre a regra?

Uma pesquisa na web pela regra gerou um documento de NESLAB . Na página B-2, lemos:

insira a descrição da imagem aqui

Figura 1. A região da soma de verificação é a única parte usada na soma de verificação.

Isso deve explicar sua confusão. O personagem principal não é incluído no cálculo. Agora, se executarmos uma verificação em CA 00 01 70 00, podemos descartar CA e ficar com alguns zeros, 01 e 70, que somam & h71.

& h71 XOR & FF = & h8E. Voila!

Comentários

  • Obrigado. Eu estava confuso sobre " Inversão bit a bit da soma de bytes de 1 byte ". Eu não sabia que significava tirar o último byte, mas você o apagou. Muito obrigado !!
  • Apenas curiosidade, por que usar XOR com h ' FF? Não ' isso é o mesmo que inverter cada bit (0- > 1, 1- > 0). Parece que ambos fazem a mesma coisa comigo. Então você poderia representá-lo como " Byte final invertido bit a bit da soma de todos os bytes em uma mensagem "
  • Sim, você está correto, mas o XOR usa apenas uma instrução para inverter todos os 8 bits. Não consigo ' não pensar em um método mais eficiente. Você pode?
  • Por algum motivo, não funciona para mim. Aqui eu tenho CA 00 01 70 00, eu somo para obter 13B, eu pego o último byte que é 3B e XOR com FF, então eu obtenho c4, que é diferente de 8E (um exemplo que peguei no manual). Eu perdi algo sobre a regra?
  • @transistor: Obrigado por esclarecer. Bem, eu não ' não conheço a linguagem de programação, apenas faz mais sentido para mim assim. Eu sei em perl que ' é apenas ~ variável. Acho que, na prática, não ' faz diferença de qualquer maneira

Resposta

Sua soma de verificação necessária é calculada nos dados da seguinte forma:

insira a descrição da imagem aqui

Você não inclui o caractere principal 0xCA na soma de verificação, apenas o sombreado bytes.

Um bit simples de código C para calcular seu exemplo:

int main() { int i; unsigned char cs; unsigned char a[] = {0x00, 0x01, 0x70, 0x00}; cs=0; for (i=0; i< sizeof(a); i++) { cs += a[i]; } cs ^=0xFF; printf("cs = %X \n", cs); return 0; } 

E o resultado é o esperado:

sh-4.3$ gcc -o main *.c sh-4.3$ main cs = 8E 

Visto que declarei a variável cs como um char não assinado, ela joga fora os bits superiores a cada adição. Adicionar é o mesmo que em outros exemplos, você pode jogar fora as partes superiores no final se estiver fazendo manualmente. Apenas tenha muito cuidado nesses casos exatamente o que é e o que não está incluído na soma de verificação.

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *