Link to home
Start Free TrialLog in
Avatar of sergiusz_m
sergiusz_m

asked on

CRC-8 ? Polynomal calculation for RS-232 device!

Hi!
I have a big problem because I have a heat device and I wan't to know how it generate CRC checksum.
data send/retrieve by this device are as below:
The last byte is a CRC.
7 0 0 0 105 1 51 ; CRC=51
4 0 0 16             ; CRC=16
7 2 0 0 0 4 196
8 0 0 151 4 11 2 234
7 0 0 0 108 1 57
4 0 11 27
7 0 0 0 100 1 41
4 0 5 21
7 0 0 0 33 1 163
4 0 2 18
7 0 0 0 22 3 207
6 0 2 228 0 185
7 0 0 0 23 3 205
6 0 2 228 0 185
7 0 0 0 23 3 205
6 0 2 241 0 147
7 0 0 0 25 2 208
5 0 4 176 144
7 0 0 0 1 2 224
5 0 2 249 213
7 0 0 0 4 2 234
5 0 3 44 2
7 0 0 0 14 1 253

where first byte signs that sequence has x bytes lenght. Maximum bytes lenght is 8 and minimum is 4.
I have asm code of this exe driver but there's no comment and almost 10 MB so I'll put it on my desk!
The last byte is a CRC, I almost quess how this CRC is calculated because:
for eq.:
7 0 0 0 105 1 51 : so the CRC is 51

five steps:
1. 2*7^0=14
2.2*14^0=28
3. 56^0=56
4.2*56^105=25
5. 2*25^1=51  ; CRC!!!!!

so the alghoritm for eq. in Matlab would be:

function f=countcrc(tab)
%inicjuje poczatkowa sume crc:
crc=bitxor( bitshift(tab(1),1) ,tab(2) );
N=tab(1)-3;
for i=1:N,
crc=bitxor( bitshift(crc,1) ,tab(i+2) );    
end
f=crc;

but the problem is when the  a xor b >255
8 0 0 151 4 11 2 234
 6 0 2 228 0 185
6 0 2 241 0 147
7 0 0 0 158 1 196
8 0 3 118 252 137 0 73

And here I don't know how these values where xor is greather than 255 are generated

Please help me!!!!!!!

Thank's a lot for any advice!!!!!
Sergiusz
Avatar of stefan73
stefan73
Flag of Germany image

Hi sergiusz_m,
> And here I don't know how these values where xor is greather than 255
> are generated

CRC-8 only uses the lowest 8 bits, so use in your matlab notation
crc=bitand(crc,255)

In ASM you achieve the same just by storing your result as a byte, or by using the "and" instruction.

Cheers,
Stefan
Avatar of sergiusz_m
sergiusz_m

ASKER

I know about it but I'm not asking about it!
look at this example:
8 0 0 151 4 11 2 234

so I use 6 steps:

1. 2*8^0=16
2. 2*16^0=32
3. 2*32^151=215 ; a.... ant there is problem because 2*215=430 >255
and now I'd like to know how to go to 234?? So what next in steep 4,5,6????
4. sth ^4= sth2 ; and now if 2*sth2^4 <255 in step 5 use 2*sth2^11 and etc..
5.
6.

there are others examples that makes xor >255:
 6 0 2 228 0 185
6 0 2 241 0 147
7 0 0 0 158 1 196

for example:
7 0 0 0 158 1 196

five steps:
1.2*7^0=14
2.2*14^0=28
3.2*28^0=56
4.2*56^158=238 ; and 2*238>255 but 196 xor 1=197 so I can quess 197 in step 5
5. 197 ^1=196

but how to go to 197 ?????? xor table or what????

So the control querende would be if ( (2*a^b) &128 !=0) ....... and what here????

The solution could be also in C/C++/Java not only in matlab.

Thanks for all
sergiusz_m
sergiusz_m,
OK. The only code I found so far was a CRC16, but it should illustrate nicely:
http://www.eagleairaust.com.au/code/crc16.htm

// Update the CRC for transmitted and received data using
// the CCITT 16bit algorithm (X^16 + X^12 + X^5 + 1).

    unsigned char ser_data;
    static unsigned int crc;

    crc  = (unsigned char)(crc >> 8) | (crc << 8);
    crc ^= ser_data;
    crc ^= (unsigned char)(crc & 0xff) >> 4;
    crc ^= (crc << 8) << 4;
    crc ^= ((crc & 0xff) << 4) << 1;

...but this should give you a good first start.

Stefan
OK Stefan thanks, this CRC looks very nice but how and where can I use it in my code????

could you type mi sample alghoritm how to use it for this data: 7 0 0 0 158 1 196 ? how to obtain this 196 using this?

Thanks a lot and you'll take a points.

Sergiusz
C code for crc:
http://ozma.ssl.berkeley.edu/~dbb/fuse/crc-code.htm

A description of the shifting/xoring (after the basics on bits :) )
http://www.4d.com/docs/CMU/CMU79909.HTM
twobitadder that's OK but I have my own case described below, so don't write how to write crc in C or how CRC works when I know nothing about used polyval in this chesksum and about behaviour when xor > 255. I've spend  hours sitting on it and I don't know what is "played" where xor >255 - the solution for it is my problem solution!!!!!! I only know (alghoritm in matlab see below) what if xor is lower than 255 so 50% of alghoritm.

Questionis still open!

Regards,
Sergiusz
ASKER CERTIFIED SOLUTION
Avatar of dimitry
dimitry

Link to home
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Start Free Trial
sergiusz_m,
Byte overflows are ignored. If you look at Dimitry's code, you'll see that all intermediate values are casted to unsigned char in the updcrc macro. That's very much like doing "& 0xff".

In other words: You just use the lower 8 bits and discard all others.

Stefan
Thanks for All
Dimitry you are genious, yes it works llike that

THANKS A LOO.......T.

Sergiusz!
You are welcome.