unsigned char *auchMsg ; /* message to calculate */
unsigned short usDataLen ; /* LRC upon quantity of */
/*
bytes in message */
{
unsigned char uchLRC = 0 ; /* LRC char initialized */
while (usDataLen--) /* pass through message */
uchLRC += *auchMsg++ ; /* buffer add buffer byte*/
/*
without carry */
return ((unsigned char)(-((char_uchLRC))) ;
/*
return twos complemen */
}
6.2 CRC Generation
The Cyclical Redundancy Check (CRC) field is two bytes, containing a 16-bit binary value. The CRC value is calculated by
the
transmitting device, which appends the CRC to the message. The receiving device recalculates a CRC during receipt of the
message, and compares the calculated value to the actual value it received in the CRC field. If the two values are not equal, an
error results.
The CRC is started by first preloading a 16-bit register to all 1's. Then a process begins of applying successive eight-bit bytes
of the message to the current contents of the register. Only the eight bits of data in each character
are used for generating the
CRC. Start and stop bits, and the parity bit, do not apply to the CRC.
During generation of the CRC, each eight-bit character is exclusive ORed with the register contents.
The result is shifted in the
direction of the least significant bit (LSB), with a zero filled into the most significant bit (MSB) position. The LSB is extracted
and examined. If the LSB was a 1, the register is then exclusive ORed with a preset, fixed value. If the LSB was a 0, no
exclusive OR takes place.
This process is repeated until eight shifts have been performed. After the last (eighth) shift, the next eight-bit character is
exclusive ORed with the register's
current value, and the process repeats for eight more shifts as described above. The final
contents of the register, after all the characters of the message have been applied, is the CRC value.
Chia sẻ với bạn bè của bạn: