Számolási módszer crc xor
XOR CRC számítási módszer
Van egy darab vas, amellyel igyekszem kommunikálni. Küldök neki itt Taku szerkezete:
# XA0; TTRKMsg = rekord
# XA0; Sbyte. byte;
# XA0; device_no. array [0..1] char;
# XA0; Command. char;
# XA0; SBuffer. byte;
# XA0; a. array [0..5] Char;
# XA0; b. array [0..5] char;
# XA0; Error. array [0..1] char;
# XA0; kér. array [0..1] char;
# XA0; EBuffer. byte;
# XA0 CRC. byte;
típus
# XA0; tBytes = array [0..23] bájt;
# XA0; pBytes = ^ tBytes;
működnek CalcCRC (xBuff: TTRKMsg): byte;
var P: pBytes;
# XA0; # XA0; i: byte;
kezdődik
# XA0; P: = @ xBuff;
# XA0; Eredmény: = 0;
# XA0; i: = 1 sizeof (xBuff) -1 do kezdődik
# XA0; # XA0; Eredmény: = Eredmény xor P ^ [i];
# XA0; end;
végén;
Jön a válasz: a készülék jelzi nekem, hogy ez nem igaz összeg CRC. Nézd, mit tehetek van, plz.
Továbbá:
indítóbitet nem vesszük figyelembe a checksum, azaz
Sbyte. byte; Nem szabad figyelembe venni kiszámításakor
>> tettem i: = 0, mert az első bit - indul el, és ő, mint írtam fent, nem vesz részt a postchete.
TTRKMsg = csomagolt rekord
.
var P: PByteArray;
# XA0; i: byte;
kezdődik
P: = @ xBuff;
Eredmény: = 0;
i: = 1-től sizeof (TTRKMsg) - 2 nem kezd // 2 -Ahogy a CRC mezőt, úgy vélem, nem veszi figyelembe
# XA0; Eredmény: = Eredmény xor P ^ [i];
végén;
Logikusan, a CRC száma nem ésszerű, de a lényeg, itt egy részlet:
„Counting byte checksum üzenete (CRC mező) által termelt művelet XOR (vagy isklyuchaeschee) minden byte az üzenet, beleértve EBuffer, kivéve SByte.”
És ha egy hurkot fel sizeof (TTrkMsg) -2, a darab vasat nem hajlandó válaszolni rá üzenet polsannoe
és ha a végén kezdjük el? downto
>> Slym is egy lehetőség, de.
Itt vagyok, mielőtt fontolóra a CRC, a szerkezet „reset” is, azaz,
Msg.CRC: = 0;
Msg.CRC: = CalcCRC (MSG);
Iron megállt öt válaszoljon. ami vagyok nagyon zavaros
érdekes. Most tekinthető CRC-t, majd írt le a szerkezet. Kiderült, hogy, hogy megváltoztatta a CRC. Egy ördögi kör, de. Talán még mindig nem kell figyelembe venni
Valami van a szerkezet TTRKMsg számít összesen 23 bájt,
> TBytes = array [0..23] bájt;
24 bájt!
offtopic: ami érdekes - ez a szemét általában semmi köze a crc. % -)
a legtöbb esetben (az én tapasztalatom szerint), CRC kellett elindítani a $ FF.
funkció CalcCRC (const xBuff: TTRKMsg): byte;
var __xBuff: array [byte] bájt abszolút xBuff;
# XA0; # XA0; i: byte;
kezdődik
# XA0; # XA0; Eredmény: = $ FF;
# XA0; # XA0; i: = sizeof (xBuff.Sbyte) a (sizeof (xBuff) -1) -sizeof (xBuff.CRC) do kezdődik
# XA0; # XA0; # XA0; # XA0; Eredmény: = Eredmény xor __xBuff [i];
# XA0; # XA0; end;
végén;
A felvétel nem csomagolt, így egy csomó lehetőséget annak befejezését, a kiviteltől függően a Delphi és a beállításokat.
ShowMessage (IntToStr (sizeof (TTRKMsg)))
Memória: 0,74 MB
Idő: 0,095 c