[Solved, sort of] Uno, 57600 baud, bad data

This little piece of code :

void setup() {
  Serial.println("just testing");

void loop(){
  char c;
  if (Serial.available() > 0){ // is there a character in the buffer?
    c = Serial.read();
    Serial.print("Incoming character is ");
    Serial.println(c);         //just shows the incoming character

Doesn't work properly at 57600 baud, Change the baud rate to anything else and it just takes off and works fine, even 115200. If I send the Uno one character at a time, I get the character properly; if I send a line like "Hello there" I get the "He" ok and the rest is junk. When I searched for other folks that had had this problem I noticed a bunch of them having problems with this baud rate for GPS applications, but nothing else.

What's up with this? What am I overlooking?

I can think of two possibilities…

  1. With the processor running at 16 MHz, none of the serial port baud rates are accurate. The error is usually tiny and insignificant. It is possible that the error is a bit higher and significant at a baud rate of 57600.

  2. This is from the core…

void HardwareSerial::begin(long baud)
uint16_t baud_setting;
bool use_u2x = true;

#if F_CPU == 16000000UL
// hardcoded exception for compatibility with the bootloader shipped
// with the Duemilanove and previous boards and the firmware on the 8U2
// on the Uno and Mega 2560.
if (baud == 57600) {
use_u2x = false;

Dear Badly,

Thank you. You gave me enough information to find the problem. It wasn't me and this HAS been discussed a lot, but on the old board. The 57600 baud rate is basically broken (at least under 021) and you can make it work by fudging the baudrate some. I found that


made it work fine for long lines of input and such. I'll look into this more and gather more data, but you got me over the hump.


Ding! I remember! Your post dug this up from my memory...

Paul Stoffregen has a nice write-up about the issue... http://www.pjrc.com/teensy/td_uart.html

IIRC, there was a problem with the UNO bootloader at 56k baud. Rather than fix the bootloader they decided to break 56k baud for all other applications.