Improve company productivity with a Business Account.Sign Up

x
  • Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 2300
  • 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
Free Tool: ZipGrep

ZipGrep is a utility that can list and search zip (.war, .ear, .jar, etc) archives for text patterns, without the need to extract the archive's contents.

One of a set of tools we're offering as a way to say thank you for being a part of the community.

 
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
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

Join & Write a Comment

Featured Post

Free Tool: SSL Checker

Scans your site and returns information about your SSL implementation and certificate. Helpful for debugging and validating your SSL configuration.

One of a set of tools we are providing to everyone as a way of saying thank you for being a part of the community.

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