Sunt programator și trebuie să trimit date la mașină, dar trebuie să adaug suma de verificare la sfârșitul datelor . Poate cineva să-mi arate un exemplu cum să o fac, așa că aș putea scrie apoi un program pentru a calcula suma de verificare pentru mine.

Regulile: inversarea în biți a sumei de 1 octeți de octeți începând cu cel mai semnificativ octet de adresă și se termină cu octetul care precede suma de control. (Pentru a efectua o inversiune bit, „exclusiv SAU” suma de un octet cu hex FF.)

Mulțumesc

Comentarii

  • Ce legătură are asta cu eticheta: electronică de putere?

Răspuns

Definiția destul de bine o acoperă.

Inversia în biți a sumei de 1 octeți de octeți începând cu cel mai semnificativ octet de adresă și terminând cu octetul care precede suma de control. (Pentru a efectua o inversiune bit, „OR exclusiv” suma de un octet cu hex FF.)

Exemplu

  • Mesaj „Bună ziua” = Hex: 48 65 6C 6C 6F.
  • Adăugarea acestora folosind Windows Calc.exe în modul Programator primesc & h01F4.
  • Luați ultimul octet și ignorați orice altceva: & hF4.
  • & hF4 XOR & hFF = & h0B – suma dvs. de verificare.

Pentru a clarifica ultimul bit:

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

Actualizare

Din anumite motive, nu funcționează pentru mine. Aici am CA 00 01 70 00, le adaug pentru a obține 13B, iau ultimul octet care este 3B și XOR cu FF, apoi primesc c4, care este diferit de 8E (un exemplu pe care l-am obținut din manual). Îmi lipsește ceva despre regulă?

O căutare pe web a regulii a aruncat un document din NESLAB . Pe pagina B-2 citim:

introduceți descrierea imaginii aici

Figura 1. Regiunea sumelor de verificare este singura parte utilizată în suma de verificare.

Acest lucru ar trebui să explice confuzia dvs. Caracterul principal nu este inclus în calcul. Acum, dacă executăm o verificare la CA 00 01 70 00, putem renunța la CA și rămânem cu câteva zerouri, 01 și 70, care însumează & h71.

& h71 XOR & FF = & h8E. Voila!

Comentarii

  • Mulțumesc. Am fost confuz cu privire la " Inversia în biți a sumei de 1 octeți a octeților ". Nu știam că înseamnă să iei ultimul octet, dar tu l-ai eliminat. Vă mulțumesc mult !!
  • Doar curios, de ce XOR cu h ' FF? Nu este ' la fel ca inversarea fiecărui bit (0- > 1, 1- > 0). Se pare că amândoi îmi fac același lucru. Apoi, l-ați putea reprezenta ca " Octet final inversat în formă de biți al sumei tuturor octeților dintr-un mesaj "
  • Da, aveți dreptate, dar XOR folosește o singură instrucțiune pentru a răsuci toți cei 8 biți. Nu pot ' să mă gândesc la o metodă mai eficientă. Poți?
  • Din anumite motive, nu funcționează pentru mine. Aici am CA 00 01 70 00, le adaug pentru a obține 13B, iau ultimul octet care este 3B și XOR cu FF, apoi primesc c4, care este diferit de 8E (un exemplu pe care l-am obținut din manual). Îmi lipsește ceva despre regulă?
  • @transistor: Vă mulțumim pentru clarificare. Ei bine, nu ' nu știu limbajul de programare, pentru mine are mai mult sens așa. Știu în perl că ' este doar variabilă. Presupun că, în practică, nu face ' o diferență în ambele sensuri

Răspuns

Suma de verificare necesară este calculată pe baza datelor astfel:

introduceți descrierea imaginii aici

nu includeți caracterul principal 0xCA în suma de control, doar umbrele octeți.

Un bit simplu de cod C pentru a vă calcula exemplul:

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; } 

Și rezultatul este așa cum era de așteptat:

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

Deoarece am declarat variabila cs ca un caracter nesemnat, aruncă biții superiori la fiecare adăugare. Adăugarea este la fel ca și alte exemple, puteți arunca biții superiori la final dacă o faceți manual. Doar fiți foarte atenți în aceste cazuri exact ce este și ce nu este inclus în suma de control.

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *