EM15 User’s Manual
Appendix I
121
RTU mode: Response Message of the Slave
START
T1-T2-T3-T4
ADDR
01H
CMD
06H
High bits of data address
10H
Low bits of data address
01H
High bits of data content
27H
Low bits of data content
10H
CRC CHK lower bit
97H
CRC CHK higher bit
36H
END
T1-T2-T3-T4
CRC Checking
In RTU mode, messages include an error-checking field that is based on a CRC method. The CRC field checks the
contents of the entire message. The CRC field is two bytes, containing a16-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, that means transmission is error
The CRC is started by 0xFFFF.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. Then 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 byte 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 bytes of the message have been applied, is the
CRC value.
When the CRC is appended to the message, the low-order byte is appended first, followed by the high-order byte.
unsigned int crc_chk_value(unsigned char *data_value,unsigned char length
{
unsigned int crc_value=0xFFFF;
int i;
while(length--)
{
crc_value^=*dat+;
for(i=0;i<8;i++)
{
if(crc_value&0x0001)
{
crc_value=(crc_value>>1)^0xa001;
}
else