Numararea crc de catre xor

Calculul CRC de către XOR

Există o bucată de fier cu care încerc să comunic. Îi trimit următoarea structură:
# xA0; TTRKMsg = înregistrare
# xA0; Sbyte. byte;
# xA0; device_no. array [0..1] de char;






# xA0; Comandă. char;
# xA0; SBuffer. byte;
# xA0; array [0..5] din Char;
# xA0; b. array [0..5] de char;
# xA0; Eroare. array [0..1] de char;
# xA0; Cerere. array [0..1] de char;
# xA0; EBuffer. byte;
# xA0; CRC. byte;

tip
# xA0; tBytes = array [0..23] de byte;
# xA0; pBytes = ^ tBytes;

funcția CalcCRC (xBuff: TTRKMsg): octet;
var P: pBytes;
# xA0; # xA0; i: byte;
începe
# xA0; P: = @ xBuff;
# xA0; Rezultat: = 0;
# xA0; pentru i: = 1 până la sizeOf (xBuff) -1 începe
# xA0; # xA0; Rezultat: = Rezultat xor P ^ [i];
# xA0; sfârșitul;
se încheie;

Răspunsul vine: dispozitivul îmi spune că CRC nu este suma corectă. Uite, poate că nu fac ce trebuie, plz.

plus:
Bitul de start nu trebuie să fie luat în considerare la calcularea sumelor de control;
Sbyte. byte; nu ar trebui să fie luată în considerare atunci când se calculează

>> Am făcut-o: = 0 deoarece primul bit este cel inițial și el, așa cum am scris mai sus, nu participă la verificarea ulterioară.

TTRKMsg = înregistrare în ambalaj
.

var P: PByteArray;
# xA0; i: byte;






începe
P: = @ xBuff;
Rezultat: = 0;
pentru i: = 1 la sizeOf (TTRKMsg) - 2 nu începe // 2 - deoarece nu trebuie să țin cont de câmpul CRC
# xA0; Rezultat: = Rezultat xor P ^ [i];
se încheie;

În mod logic, CRC nu este considerat rezonabil, dar din nou este fragmentul:
"Numărarea octetului mesajului din suma de control a mesajului (câmpul CRC) se efectuează prin efectuarea operației XOR (exclusiv sau) a tuturor octeților de mesaje, inclusiv EBuffer, fără a include SByte."

Și dacă faceți o buclă la SizeOf (TTrkMsg) -2, atunci hardware-ul refuză, în general, să răspundă la un mesaj care îi este trimis

dar dacă începeți la sfârșit? downto

>> Slym este, de asemenea, o opțiune, dar.

Aici sunt aici înainte de a număra CRC, în structura "zero", adică

Msg.CRC: = 0;
Msg.CRC: = CalcCRC (MSG);

Fierul a oprit cinci pentru a-mi răspunde. eu sunt complet confuz

interesant. Aici am numărat CRC, apoi l-am scris în structură. Se pare că prin aceasta ați schimbat CRC. Un cerc vicios, totuși. Probabil, încă nu ar trebui să fie luată în considerare

Ceva din structura ta TTRKMsg a numărat numai 23 de octeți și în

> tBytes = array [0..23] de byte;

24 octeți!

offtopic: ceea ce este interesant - acest rahat, în general, nu are nimic de-a face cu crc. % -)

în cele mai multe cazuri (în practica mea), CRC a trebuit să inițializeze $ FF.

funcția CalcCRC (const xBuff: TTRKMsg): octet;
var __xBuff: array [octet] de octet absolut xBuff;
# xA0; # xA0; i: byte;
începe
# xA0; # xA0; Rezultat: = $ FF;
# xA0; # xA0; pentru i: = sizeof (xBuff.Sbyte) la (sizeOf (xBuff) -1) -sizeof (xBuff.CRC)
# xA0; # xA0; # xA0; # xA0; Rezultat: = Rezultat xor __xBuff [i];
# xA0; # xA0; sfârșitul;
se încheie;

Înregistrarea nu este împachetată, deci o grămadă de opțiuni pentru umplerea acesteia, în funcție de versiunea și setările Delphi.
ShowMessage (IntToStr (SizeOf (TTRKMsg)))

Memorie: 0,74 MB
Durată: 0,095 sec







Articole similare

Trimiteți-le prietenilor: