• Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 2280
  • Last Modified:

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
0
sergiusz_m
Asked:
sergiusz_m
  • 4
  • 3
  • 2
  • +1
1 Solution
 
stefan73Commented:
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
0
 
sergiusz_mAuthor Commented:
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
0
 
stefan73Commented:
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
0
2018 Annual Membership Survey

Here at Experts Exchange, we strive to give members the best experience. Help us improve the site by taking this survey today! (Bonus: Be entered to win a great tech prize for participating!)

 
sergiusz_mAuthor Commented:
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
0
 
twobitadderCommented:
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
0
 
sergiusz_mAuthor Commented:
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
0
 
dimitryCommented:
I think I understand this CRC, but check me, because I may be wrong.
If your current (CRC & 0x80) == 0x80 (it means that next shift will be > 255) then you need to XOR it with 0x19.
Take a look at the code:

#include <stdio.h>

#define updcrc(cp, crc) ((unsigned char)(crc << 1) ^ (unsigned char)cp)

unsigned char array[] = { 8, 0, 0, 151, 4, 11, 2, 234 };
// unsigned char array[] = { 7, 0, 0, 0, 105, 1, 51 };
// unsigned char array[] = { 7, 0, 0, 0, 1, 2, 224 };
// unsigned char array[] = { 7, 0, 0, 0, 4, 2, 234 };
// unsigned char array[] = { 7, 0, 0, 0, 158, 1, 196 };
// unsigned char array[] = { 8, 0, 3, 118, 252, 137, 0, 73 };
// unsigned char array[] = { 6, 0, 2, 241, 0, 147 };
// unsigned char array[] = { 7, 2, 0, 0, 0, 4, 196 };
// unsigned char array[] = { 5, 0, 3, 44, 2 };
int main( void )
{
  unsigned short mycrc = 0;
  int i;

  printf("Result = [%x]\n", array[0] );  
  for(i=1,mycrc=array[0];( i < (sizeof(array)-1) );i++) {
    if( mycrc & 0x80 )
      mycrc = (updcrc( array[i], mycrc )) ^ 0x19;
    else
      mycrc = updcrc( array[i], mycrc );
    printf("Result = [%x] -> %x\n", array[i], mycrc );
  }
  if( mycrc != array[i] )
    printf("Error CRC calculation %x != %x\n", mycrc, array[i]);
  printf("Result = %d\n", (unsigned short)mycrc );
  return( 0 );
}
0
 
stefan73Commented:
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
0
 
sergiusz_mAuthor Commented:
Thanks for All
Dimitry you are genious, yes it works llike that

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

Sergiusz!
0
 
dimitryCommented:
You are welcome.
0

Featured Post

[Webinar] Improve your customer journey

A positive customer journey is important in attracting and retaining business. To improve this experience, you can use Google Maps APIs to increase checkout conversions, boost user engagement, and optimize order fulfillment. Learn how in this webinar presented by Dito.

  • 4
  • 3
  • 2
  • +1
Tackle projects and never again get stuck behind a technical roadblock.
Join Now