Sono un programmatore e ho bisogno di inviare dati alla macchina, ma devo aggiungere il checksum alla fine dei dati . Qualcuno può mostrarmi un esempio come farlo in modo che io possa scrivere un programma per calcolare il checksum per me.

Le regole: inversione bit per bit della somma di 1 byte di byte che inizia con il byte dellindirizzo più significativo e termina con il byte che precede il checksum. (Per eseguire uninversione bit per bit, “OR esclusivo” la somma di un byte con FF hex.)

Grazie

Commenti

  • Cosa centra questo con il tag: power-electronics?

Answer

La definizione piuttosto bene lo copre.

Inversione bit per bit della somma di 1 byte di byte che inizia con il byte di indirizzo più significativo e termina con il byte che precede il checksum. (Per eseguire uninversione bit per bit, “OR esclusivo” la somma di un byte con FF hex.)

Esempio

  • Message “Hello” = Hex: 48 65 6C 6C 6F.
  • Aggiungendoli utilizzando il mio Windows Calc.exe in modalità Programmatore ottengo & h01F4.
  • Prendi lultimo byte e ignora tutto il resto: & hF4.
  • & hF4 XOR & hFF = & h0B – il tuo checksum.

Per chiarire lultima parte:

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

Aggiorna

Per qualche motivo, non funziona per me. Qui ho CA 00 01 70 00, li sommo per ottenere 13B, prendo lultimo byte che è 3B e XOR con FF, poi ottengo c4, che è diverso da 8E (un esempio che ho preso dal manuale). Mi sono perso qualcosa della regola?

Una ricerca sul web per la regola ha generato un documento da NESLAB . A pagina B-2 leggiamo:

inserisci qui la descrizione dellimmagine

Figura 1. La regione del checksum è lunica parte utilizzata nel checksum.

Questo dovrebbe spiegare la tua confusione. Il personaggio principale non è incluso nel calcolo. Ora, se eseguiamo un controllo su CA 00 01 70 00, possiamo eliminare CA e restano alcuni zeri, 01 e 70 che si sommano a & h71.

& h71 XOR & FF = & h8E. Voilà!

Commenti

  • Grazie. Ero confuso riguardo l " inversione bit per bit della somma di 1 byte di byte ". Non sapevo che significasse prendere lultimo byte, ma lhai cancellato. Grazie mille !!
  • Sono solo curioso, perché XOR con h ' FF? ' non è come invertire ogni bit (0- > 1, 1- > 0). Sembra che entrambi facciano la stessa cosa con me. Quindi potresti rappresentarlo come " byte finale invertito bit per bit della somma di tutti i byte in un messaggio "
  • Sì, hai ragione, ma XOR usa solo unistruzione per capovolgere tutti gli 8 bit. Non riesco ' a pensare a un metodo più efficiente. Puoi?
  • Per qualche motivo, non funziona per me. Qui ho CA 00 01 70 00, li sommo per ottenere 13B, prendo lultimo byte che è 3B e XOR con FF, poi ottengo c4, che è diverso da 8E (un esempio che ho preso dal manuale). Mi manca qualcosa della regola?
  • @transistor: Grazie per aver chiarito. Beh, non ' non conosco il linguaggio di programmazione, per me ha semplicemente più senso in questo modo. So che in perl ' è solo una ~ variabile. Immagino che in pratica non ' faccia la differenza

risposta

Il checksum richiesto viene calcolato sui dati in questo modo:

inserisci qui la descrizione dellimmagine

non includi il carattere principale 0xCA nel checksum, solo il carattere ombreggiato byte.

Un semplice bit di codice C per calcolare il tuo esempio:

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 il risultato è come previsto:

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

Poiché ho dichiarato la variabile cs come un carattere senza segno, elimina i bit superiori ad ogni aggiunta. Laggiunta è la stessa degli altri esempi, puoi buttare via i bit superiori alla fine se lo fai manualmente. Fai solo molta attenzione in questi casi a cosa è e cosa non è incluso nel checksum.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *