Following on from a discussion in this thread:
The posters there wanted to use the "9th" bit in async comms to communicate with some gadget that uses that extra bit as a "command" bit.
This turned out to be a bit non-trivial, so I have made an amended HardwareSerial library, which can be downloaded from here:
http://gammon.com.au/Arduino/HardwareSerial9bit.zip
The diffs for any developers interested are:
http://gammon.com.au/Arduino/hardwareSerial_diffs.txt
Because of the way that hardware serial is integrated into the IDE it is, unfortunately, necessary to find your existing files:
HardwareSerial.cpp
HardwareSerial.h
... and replace them with the ones in the download.
Note that this is for version 1.0 1.0.1 of the IDE. No guarantees are given that this will work with other versions. Be warned.
Changes:
- The internal buffers have been changed from 8-bit characters to 16-bit characters (to hold the 9th bit). Thus the buffers double in size.
- There is a new argument to the Serial.begin() function, which is a boolean, whether or not you want 9-bit mode. It defaults to false.
- There is a new function Serial.write9bit (). This takes an unsigned int argument, letting you supply a character with the 9th bit set. I didn't want to change the existing write function because it is used in the Print class.
- The read function, which already returns an int, now will return the 9th bit where required.
Test sketch, run on a Mega2560:
void setup ()
{
Serial.begin (115200); // debugging prints
Serial1.begin (115200, true); // 9 bit mode
Serial2.begin (115200, true); // 9 bit mode
Serial.println ("--- starting ---");
} // end of setup
int i;
void loop ()
{
Serial1.write9bit (i++); // send another byte
// display incoming on Serial2
if (Serial2.available ())
Serial.println ((int) Serial2.read (), HEX);
// check if we have sent all possible characters
if (i >= 0x200)
{
delay (100);
while (Serial2.available ())
Serial.println ((int) Serial2.read (), HEX);
delay (5000);
i = 0;
} // end of sent 512 bytes
} // end of loop
The sketch uses Serial (pins D0 and D1) for debugging. To test jumper D18 (Tx1) and D19 (Rx2).
The sketch will send all possible 512 bytes out from Serial1, and read them into Serial2, displaying them on Serial for manual evaluation.