UART message creation
This is a description of how to create a UART message for the driver and common block API.
UART message structure
| Byte | Description | 
|---|---|
| 0 | session | 0x80 | 
| 1 | (session | 0x80)^0x55 | 
| 2 | Message lenght -1 | 
| 3 | SID | 
| 4 | Receiver address | 
| 5 | Payload bit 0 | 
| 6 | Payload bit 1 | 
| 7 | Payload bit 2 | 
| 5 + n | Payload bit n | 
| Last byte | CRC | 
How to calculate CRC
It is XOR from bytes in the UART message. The First 2 bytes are not counted to CRC.
crc = Byte2 ^ Byte3 ^ Byte4 ^ ... ^ Last_byte
Example of code to create the UART frame in C
/*!
    \brief Create the UART frame
    \param[in] data_len - Number of bytes to send
    \param[in] data - data to send
                0 byte of data = SID
                1 byte of data = Receiver addr
                2-end bytes = Payload
    \param[in] txbuf - Output buffer
    \param[in] tx_len - Number of bytes in output buffer
    \return int32_t
            0 - succes
            -1 - output (tx) buffer is small
*/
int32_t
umsg_send_msg(uint8_t data_len, uint8_t* data, uint8_t* txbuf, uint8_t tx_len)
{
    static uint8_t session = 0;
    if (data_len + 4 > tx_len)
        return -1;
    uint8_t* ptr = txbuf;
    uint8_t i;
    session |= 0x80;
    *ptr++ = session;
    *ptr++ = session ^ 0x55;
    *ptr++ = data_len - 1;
    uint8_t crc = 0;
    crc ^= data_len - 1;
    for (i = 0; i < data_len; i++) {
        crc ^= *data;
        *ptr++ = *data++;
    }
    *ptr++ = crc;
    session++;
    return 0;
}