Skip to content

Commit

Permalink
Fixing 300 baud communication for serial.
Browse files Browse the repository at this point in the history
Because UBBR is only 12 bits, we were overflowing it at 300 baud because of the use of the U2X bit.  Now we turn off U2X if it would yield a UBBR value that would overflow.

Note that this breaks 300 baud communication with the computer on the Uno and Mega 2560 because the 8U2 USB-serial firmware has this same bug (and previously they cancelled each other out).  Since, however, it seems more likely that people will need to use 300 baud to communicate with other (legacy) hardware than with the computer, I'm making this change.  Issue for 8U2 firmware bug: http://code.google.com/p/arduino/issues/detail?id=542

http://code.google.com/p/arduino/issues/detail?id=522
  • Loading branch information
damellis committed May 14, 2011
1 parent fcb66dd commit db64d2f
Showing 1 changed file with 8 additions and 0 deletions.
8 changes: 8 additions & 0 deletions hardware/arduino/cores/arduino/HardwareSerial.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -204,6 +204,8 @@ void HardwareSerial::begin(unsigned long baud)
use_u2x = false;
}
#endif

try_again:

if (use_u2x) {
*_ucsra = 1 << _u2x;
Expand All @@ -212,6 +214,12 @@ void HardwareSerial::begin(unsigned long baud)
*_ucsra = 0;
baud_setting = (F_CPU / 8 / baud - 1) / 2;
}

if ((baud_setting > 4095) && use_u2x)
{
use_u2x = false;
goto try_again;
}

// assign the baud_setting, a.k.a. ubbr (USART Baud Rate Register)
*_ubrrh = baud_setting >> 8;
Expand Down

0 comments on commit db64d2f

Please sign in to comment.