aboutsummaryrefslogtreecommitdiff
path: root/cores
diff options
context:
space:
mode:
authorDavid A. Mellis <d.mellis@arduino.cc>2011-05-14 12:25:39 -0400
committerDavid A. Mellis <d.mellis@arduino.cc>2011-05-14 12:25:39 -0400
commitf25e71c3c1e96d50ffd5684d0409890a2378d113 (patch)
tree9c976e656cfd8c1a9bae7038541062e6f3d3d785 /cores
parent5e721df32a49d8f74058ba0f824ffe9686a0c9d7 (diff)
Fixing 300 baud communication for serial.
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
Diffstat (limited to 'cores')
-rw-r--r--cores/arduino/HardwareSerial.cpp8
1 files changed, 8 insertions, 0 deletions
diff --git a/cores/arduino/HardwareSerial.cpp b/cores/arduino/HardwareSerial.cpp
index 38e87c4..b5dba1e 100644
--- a/cores/arduino/HardwareSerial.cpp
+++ b/cores/arduino/HardwareSerial.cpp
@@ -204,6 +204,8 @@ void HardwareSerial::begin(unsigned long baud)
use_u2x = false;
}
#endif
+
+try_again:
if (use_u2x) {
*_ucsra = 1 << _u2x;
@@ -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;