In Progress

Arduino Uno Rev3 9-bit communication

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);


Skills: Arduino, C Programming

See more: bit serial arduino, arduino polynomial, arduino crc bit, arduino serial bit, arduino bit byte, variable programming, variable in programming, use of algorithm in programming, unsigned bits, string algorithm, starting programming, sketch programming, set bits in c, set bits, set bit in c, set a bit in c, serial programming, serial port programming, return oriented programming, public programming, programming variable, programming definition, programming array, programming arduino in c, programming algorithm example

About the Employer:
( 0 reviews ) Maldonado, Uruguay

Project ID: #2465816

Awarded to:


Hello , we can complete this project. Please check PM for bid details.

$180 USD in 8 days
(2 Reviews)

5 freelancers are bidding on average $232 for this job


Hi, I can do this job.

$250 USD in 3 days
(17 Reviews)

Hi, please check PMB. Thanks.

$250 USD in 10 days
(16 Reviews)

Dear Sir, I have 10 year experience on analog design, audio system, power electronics, digital motor control, inverters, converters, DC-DC converters, power distribution sysetms, PCB design, circuit simulation, syst More

$200 USD in 4 days
(3 Reviews)

Custom software development (<b><i>Removed by Admin</i></b>)

$250 USD in 1 day
(0 Reviews)

Expert Arduino Engineer

$230 USD in 7 days
(1 Review)