Arduino Uno Rev3 9-bit communication

This project was awarded to rsdevelopers for $180 USD.

Get free quotes for a project like this
Employer working
Project Budget
$30 - $250 USD
Total Bids
Project Description

I need to implement an Arduino Sketch (for Arduino Uno Rev 3 AND/OR Arduino Mega 2560) which give me access to communicate using Arduino serial port based on 9-bit communication.

The basic features I need to solve are :

1) send pre-defined packets on TX (packet = byte array based on protocol specification defined at the end of this spec)

(example of packet to send = 0x01 0x53 0x00 0x05 0x91 0x27 , 0x91 0x27 must be calculated using CRC formula Algorithm defined at the end of this spec)

2) listen for incoming packets on RX (packet = byte array based on protocol specification defined at the end of this spec).

on each incoming packet must :

2.1 - determine if the first incoming byte has 9th bit flag set or not.

2.2 - check CRC to determine if it is correct or not (check CRC Algorithm spec defined at the end of this spec)



Communication must occurs through a serial data link operating at 19.2 KBaud in a "wakeup" mode.

The 11-bit data packet consists of one start bit, eight data bits, a ninth ‘wakeup’ bit, and one stop bit.

In wakeup mode (outgoing packets), arduino must sets the 9th (wakeup) bit each time it sends the first byte of a message to the client.

For all additional bytes in the message, this bit is cleared.

For incoming packets, Arduino must use the wakeup bit (9th bit) to determine whether the received byte is the first byte of a new message or an additional byte of the current message.



The CRC follows the basic CCITT convention by starting with the most significant byte, least significant bit and applying the CRC polynomial x^16+x^12+x^5+1. Figure 5.1 details a fast CRC calculating routine from the public domain. The routine can be used to generate message CRCs as well as the variable-seed calculation needed for ROM signatures.

CRC Algorithm

//Function: CRC

//Purpose: Calculate the 16-bit CRC of a string using

// a byte-oriented tableless algorithm. The

// routine inputs are the buffer pointer, the

// buffer length, and the seed for the

// calculation. The magic number 010201 octal

// is derived from the CRC polynomial

// x^16+x^12+x^5+1.

//Passed in: unsigned char, int, unsigned short

//Passed out: unsigned short

unsigned short CRC(unsigned char *s, int len, unsigned short crcval)


register unsigned c,q;

for (; len; len--)


c = *s++;

q = (crcval ^ c) & 017;

crcval = (crcval >> 4) ^ (q * 010201);

q = (crcval ^ (c >> 4)) & 017;

crcval = (crcval >> 4) ^ (q * 010201);


return (crcval);


Looking to make some money?

  • Set your budget and the timeframe
  • Outline your proposal
  • Get paid for your work

Hire Freelancers who also bid on this project

    • Forbes
    • The New York Times
    • Time
    • Wall Street Journal
    • Times Online