START_BYTE = 0x96; // 10010110 STOP_BYTE = 0xA9; // 10101001 DEFAULT ADDRESS 160 =0XA0 RELAY1 ON- 1N RELAY1 OFF- 1F RELAY2 ON - 2N RELAY2 OFF - 2F RELAY3 ON - 3N RELAY3 OFF - 3F RELAY4 ON - 4N RELAY4 OFF - 4F RELAY5 ON - 5N RELAY5 OFF - 5F RELAY6 ON - 6N RELAY6 OFF - 6F RELAY7 ON -7N RELAY7 OFF - 7F RELAY8 ON -8N RELAY8 OFF - 8F PACKAGE TO [ON RELAY1] -------- START_BYTE 0x96 ADDRESS 0xA0 DATALEN 0x82 [DATA1] 0x31 ----1 [DATA2] 0x4E ----N CRC 0xA2 STOP_BYTE 0xA9 /********************************************************/ PACKAGE TO [CHANGE THE ADDRESS FROM 160 TO 50] -------- START_BYTE 0x96 ADDRESS 0xA0 ---160 OLD ADDRESS DATALEN 0x82 [DATA1] 0x52 [DATA2] 0x32 --- 50 NEW ADDRESS CRC 0xBD STOP_BYTE 0xA9 RESET THE RELAY BOARD /**************************************************************/ /********************************************************/ PACKAGE TO [CHANGE THE ADDRESS FROM 50 TO 160] -------- START_BYTE 0x96 ADDRESS 0x32 --- 50 OLD ADDRESS DATALEN 0x82 [DATA1] 0x52 [DATA2] 0xA0 --- 160 NEW ADDRESS CRC 0xBD STOP_BYTE 0xA9 RESET THE RELAY BOARD /**************************************************************/ CRC generation : ---------------- crc_send = datalen ^ address; crc_send ^= data[0]; // if exists crc_send ^= data[1]; // if exists crc_send ^= data[2]; // if exists crc_send = ~crc_send; if ((crc_send == START_BYTE) || (crc_send == STOP_BYTE)) crc_send++; NOTE: DATALEN<4..0> can not take the START_BYTE<4..0> or STOP_BYTE<4..0> values.