Jag är programmerare och jag måste skicka data till maskinen, men jag måste lägga till kontrollsumma i slutet av data . Kan någon visa mig ett exempel på hur man gör det så att jag sedan kunde skriva ett program för att beräkna kontrollsumman för mig.

Reglerna: Bitvis inversion av 1 byte summan av byte som börjar med den viktigaste adressbyten och slutar med byten före kontrollsumman. (För att utföra en bitvis inversion, ”exklusiv ELLER” den ena bytesumman med FF-hex.)

Tack

Kommentarer

  • Vad har detta att göra med taggen: kraftelektronik?

Svar

Definitionen ganska bra täcker det.

Bitvis inversion av 1 bytesumman av byte som börjar med den mest betydande adressbyten och slutar med byten före kontrollsumman. (För att utföra en bitvis inversion, ”exklusiv ELLER” den ena bytesummen med FF-hex.)

Exempel

  • Meddelande ”Hello” = Hex: 48 65 6C 6C 6F.
  • Lägga till dessa med min Windows Calc.exe i programmeringsläge får jag & h01F4.
  • Ta den sista byten och ignorera allt annat: & hF4.
  • & hF4 XOR & hFF = & h0B – din kontrollsumma.

För att klargöra den sista biten:

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

Uppdatering

Av någon anledning fungerar det inte för mig. Här har jag CA 00 01 70 00, jag lägger till dem för att få 13B, jag tar den sista byten som är 3B och XOR med FF, sedan får jag c4, vilket skiljer sig från 8E (ett exempel jag fick från manualen). Saknar jag något om regeln?

En webbsökning efter regeln kastade upp ett dokument från NESLAB . På sidan B-2 läser vi:

ange bildbeskrivning här

Figur 1. Kontrollsumregionen är den enda delen som används i kontrollsumman.

Detta borde förklara din förvirring. Huvudkaraktären ingår inte i beräkningen. Om vi nu kontrollerar CA 00 01 70 00 kan vi släppa CA och har några nollor, 01 och 70, som summerar till & h71.

& h71 XOR & FF = & h8E. Voila!

Kommentarer

  • Tack. Jag var förvirrad över " Bitvis inversion av 1 bytesumman av byte ". Jag visste inte att det betyder att ta den sista byten, men du rensade det. Tack så mycket !!
  • Bara nyfiken, varför XOR med h ' FF? Är inte ' t samma som att bara invertera varje bit (0- > 1, 1- > 0). Verkar som att båda gör samma sak mot mig. Då kan du representera det som " Bitvis inverterad slutlig byte av summan av alla byte i ett meddelande "
  • Ja, du har rätt men XOR använder bara en instruktion för att vända alla 8 bitarna. Jag kan ' inte tänka mig en effektivare metod. Kan du?
  • Av någon anledning fungerar det inte för mig. Här har jag CA 00 01 70 00, jag lägger till dem för att få 13B, jag tar den sista byten som är 3B och XOR med FF, sedan får jag c4, vilket skiljer sig från 8E (ett exempel jag fick från manualen). Saknar jag något om regeln?
  • @transistor: Tack för att du klargjorde. Tja, jag vet inte ' programmeringsspråket, det är bara vettigare för mig så. Jag vet att i perl är det ' bara ~ variabel. Jag antar att det i praktiken inte ' gör skillnad på något sätt

Svar

Din krävda kontrollsumma beräknas enligt data enligt följande:

ange bildbeskrivning här

Du inte inkluderar huvudtecknet 0xCA i kontrollsumman, bara den skuggade byte.

En enkel bit C-kod för att beräkna ditt exempel:

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

Och resultatet är som förväntat:

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

Eftersom jag förklarade variabeln cs som en osignerad kar kastar den bort de övre bitarna vid varje tillägg. Att lägga till är precis samma som andra exempel, du kan kasta bort de övre bitarna i slutet om du gör det manuellt. Var bara riktigt försiktig i dessa fall exakt vad är och vad inte ingår i kontrollsumman.

Lämna ett svar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *