Email: Password: Remember Me | Create Account (Free)

Back to Subject List

Old thread has been locked -- no new posts accepted in this thread
???
02/08/03 16:24
Read: times


 
#38614 - RE: CRC CALCULATION?
Responding to: ???'s previous message
Hi Max

I found this code on the web..It may be what your looking for..
-------------------------------------------
/* START LIBRARY DESCRIPTION *********************************************
CRC16.LIB
Copyright (c) 1996, Robust DataComm.

DESCRIPTION: Calc CRC-16 per Modbus using XMODEM type table

SUPPORT LIB'S:
END DESCRIPTION **********************************************************/

// History:

unsigned int crc16_uCalcBuf( unsigned char *ucpBuf, int nByteCount);
unsigned int crc16_uCalcByte( unsigned char uc, unsigned int uCRC);
void crc16_Init( void); // pre-seed Table[] (must call to init table!)

ushort crc16_Table[256]; // table for partial CRC seeds


/* START FUNCTION DESCRIPTION ********************************************
crc16_uCalcBuf <CRC16.LIB>

SYNTAX: unsigned int crc16_uCalcBuf( uchar *ucpBuf, int nByteCount);

DESCRIPTION: Given buffer ptr & byte count, calc new CRC-16

RETURN VALUE: return CRC-16 (swap bytes for Modbus)
END DESCRIPTION **********************************************************/
unsigned int crc16_uCalcBuf( uchar *ucpBuf, int nByteCount)
{
ushort crc_data; // holder of byte during calc
ushort crc_crc; // holder of CRC
int crc_i; // loop counter

crc_crc = 0xFFFF; // start with all 1's for reverse CRC
// printf( " <*> crc%xn", crc_crc);
for( crc_i = 0; crc_i < nByteCount; ++crc_i) { // process each byte
crc_data = crc_crc ^ ucpBuf[crc_i];
crc_crc = (crc_crc >> 8) ^ crc16_Table[crc_data & 0x00FF];
// printf( " crc%d:%x", crc_i, crc_crc);
}
return( crc_crc);
}
/* Modbus CRC are stored MSByte in lo byte - you must swap bytes */

/* START FUNCTION DESCRIPTION ********************************************
crc16_uCalcByte <CRC16.LIB>

SYNTAX: unsigned int crc16_uCalcByte( uchar uc, ushort uCRC);

DESCRIPTION: accumulate CRC 1 byte at a time (use 0xFFFF for first call)

RETURN VALUE: none
END DESCRIPTION **********************************************************/
unsigned int crc16_uCalcByte( uchar uc, ushort uCRC)
{
static ushort crc_data; // holder of byte during calc

crc_data = uCRC ^ uc;
uCRC = (uCRC >> 8) ^ crc16_Table[crc_data & 0x00FF];
return( uCRC);
}

/* crc16_Init() - Initialize the CRC-16 table (crc16_Table[])
*/
void crc16_Init( void)
{
ushort crc_data; // holder of byte during calc
ushort crc_crc; // holder of CRC
int crc_i; // loop counter
char j; // loop counters

for( crc_i = 0; crc_i < 256; crc_i++) {
crc_data = (crc_i << 1);
crc_crc = 0;
for( j = 8; j > 0; j--) {
crc_data >>= 1;
if( (crc_data ^ crc_crc) & 0x0001)
crc_crc = (crc_crc >> 1) ^ 0xA001;
else
crc_crc >>= 1;
} // endfor j
crc16_Table[crc_i] = crc_crc;
// printf( " %d:%x", crc_i, crc16_Table[crc_i]);
} // endfor crc_i

return;
}


List of 18 messages in thread
TopicAuthorDate
CRC CALCULATION?            01/01/70 00:00      
   RE: CRC CALCULATION?            01/01/70 00:00      
   RE: CRC CALCULATION?            01/01/70 00:00      
      RE: CRC CALCULATION?            01/01/70 00:00      
         RE: CRC CALCULATION?            01/01/70 00:00      
            RE: CRC CALCULATION?            01/01/70 00:00      
         RE: CRC CALCULATION?            01/01/70 00:00      
            RE: CRC CALCULATION - Christian            01/01/70 00:00      
               RE: CRC CALCULATION - Christian            01/01/70 00:00      
                  RE: CRC CALCULATION - Christian            01/01/70 00:00      
               RE: CRC CALCULATION - Christian            01/01/70 00:00      
                  RE: CRC CALCULATION - Christian            01/01/70 00:00      
   RE: CRC CALCULATION?            01/01/70 00:00      
   RE: CRC CALCULATION?            01/01/70 00:00      
      RE: CRC CALCULATION?            01/01/70 00:00      
   RE: CRC CALCULATION?            01/01/70 00:00      

Back to Subject List