user220: The standard is 9600 baud. That's just the standard. Using a Arduino Uno SMD R2, what is the highest practical baud rate I can achieve?
Bonus points for the audacious: How would you go about creating an error checking mechanism and then increasing the baud rate ridiculous high to get high transfer rates?

user83: This is probably one of the few aspects where el-Cheapo boards differ from original boards. The maximum serial transfer rate is pretty much only limited by the quality of the board and its layout. Once the serial data enters either AVR or USB interface chip, the data will be processed differently from the serial UART protocol. 
Keep in mind though that the microcontroller has some basic hardware to shift in/out serial data to/from the IO pins, but the absolute maximum rate is limited to the 16MHz clock (for AVRs). Once a byte is moved to the serial buffer, the UART hardware will take over and push out / pull in the bits on its own. An AVR at best reaches 16M instructions per second and the interrupts used to fill the serial buffer have some overhead (at least 8 clock ticks for the interrupt handling + instructions to save current state + several instructions for actually filling the buffer). At a given bitrate, the protocol will run at a whopping n bits per second, but your controller needs more time to fill the serial buffer than it needs to actually output the data, resulting in a lower average throughput than you expect and the UART idling for a relatively long time. Disadvantage is the increased probability for bit errors.
Another effect to remember is that all the overhead required to push data out onto UART (or pull it in) cannot be spent in your actual program, again affecting the average practical throughput. You can only use every instruction cycle once, either for filling the buffer or for computing the main loop.
The maximum throughput is therefore dependent on the application you use (how fast is data generated/computed/ready to move to/from the serial buffer) and the actual 'physical' bitrate is only a small part of the design decision.

user160: Error checking is actually very easy and there is an AVR lib that does this in a one liner.     
Read up on  util/crc16.h and you should be good to go in no time with the included examples.
CRC is quite robust and fast for simple applications.

user11: The Arduino Serial Monitor window limits you to 115200, but that's not the highest baud rate capable. You can read the Atmel and the FT232 (or whatever you're using) datasheets to find out the maximum but I am able to successfully use 230400 (twice as fast as the largest the Arduino Serial Monitor supports) with no issues.
If you want to see the results in your computer, you will need another serial monitor that supports other baud rate options. I like CoolTerm and Termite.
Do note that this heavily depends on your clock speed as well.
Here's a calculator to help you with calculating what's possible.

user86: There are several factors here:

How high of a baud-rate can the ATmega328P MCU achieve?
How high of a baud-rate can the USB-Serial interface achieve?
What is the oscillator frequency on the ATmega328P?
What is the oscillator frequency on the USB-serial interface (if it has one)?
How tolerant is the USB-serial interface of baud-rate mismatch?

All of these factors are relevant to determining the maximum achieveable baud rate. The ATmega328P uses a hardware divisor from it's clock-rate to generate the base-clock for the serial interface. If there is no integer ratio from the main clock to the bit-time of the desired baud rate, the MCU will not be able to exactly produce the desired rate. This can lead to potential issues, as some devices are much more sensitive to baud-rate mismatch then others.
FTDI-based interfaces are quite tolerant of baud-rate mismatch, up to several percent error. However, I have worked with specialized embedded GPS modules that were unable to handle even a 0.5% baud rate error.
General serial interfaces are tolerant of ~5% baud-rate error. However, since each end can be off, a more common spec is +-2.5%. This way, if one end is 2.5% fast, and the other is 2.5% slow, your overall error is still only 5%.

Anyways. The Uno uses a ATmega328P as the primary MCU, and a ATmega16U2 as the USB-serial interface. We're also fortunate here in that both these MCUs use similar harware USARTs, as well as 16 Mhz clocks. 
Since both MCUs have the same harware and clock-rate, they'll both have the same baud-rate error in the same direction, so we can functionally ignore the baud error issue.
Anyways, the "proper" answer to this question would involve digging up the source for the ATmega16U2, and working out the possible baud-rates from there, but since I'm lazy, I figure simple, empirical testing will work.
A quick glance at the ATmega328P datasheet produces the following table:

So given the max stated baud-rate of 2 Mbps, I wrote a quick test program:  
void setup(){};

void loop()
{

  delay(1000);
  Serial.begin(57600);
  Serial.println("\r\rBaud-rate = 57600");
  delay(1000);
  Serial.begin(76800);
  Serial.println("\r\rBaud-rate = 76800");
  delay(1000);
  Serial.begin(115200);
  Serial.println("\r\rBaud-rate = 115200");
  delay(1000);
  Serial.begin(230400);
  Serial.println("\r\rBaud-rate = 230400");
  delay(1000);
  Serial.begin(250000);
  Serial.println("\r\rBaud-rate = 250000");
  delay(1000);
  Serial.begin(500000);
  Serial.println("\r\rBaud-rate = 500000");
  delay(1000);
  Serial.begin(1000000);
  Serial.println("\r\rBaud-rate = 1000000");
  delay(1000);
  Serial.begin(2000000);
  Serial.println("\r\rBaud-rate = 2000000");
};

And then looking at the relevant serial port with a serial terminal:  

So it appears the hardware can run at 2,000,000 baud without problems.
Note that this baud rate only gives the MCU 64 80 clock-cycles per byte, so it would be very challenging to keep the serial interface busy. While the individual bytes may be transferred very rapidly, there is likely to be lots of time when the interface is simply idle.

Edit: Actual Testing!
The 2 Mbps is real:

each bit-time is 500 ns, which matches exactly with what is expected.
Performance issues! Overall packet length:
500 Kbaud:

1 Mbaud:

2 Mbaud:

Note: The noticeable overshoot is due to poor scope probe grounding practices, and is probably not real. I'm using the ground-clip-lead that's part of my scope probe, and the lead-inductance is likely the cause of the majority of the overshoot.
As you can see, the overall transmission length is the same for 0.5, 1 and 2 Mbaud. This is because the code that is placing the bytes in the serial buffer is poorly optimized. As such, you will never achieve anything better then an effective 500 Kbaud, unless you write your own serial libraries. The Arduino libraries are very poorly optimized, so it probably wouldn't be too hard to get a proper 2 Mbaud, at least for burst transmissions, if you spent a bit of time on it.

220: <p>The standard is 9600 baud. That's just the <em>standard</em>. <strong>Using a Arduino Uno SMD R2, what is the highest practical baud rate I can achieve?</strong></p>

<p>Bonus points for the audacious: <strong>How would you go about creating an error checking mechanism and then increasing the baud rate ridiculous high to get high transfer rates?</strong></p>
 83: <p>This is probably one of the few aspects where el-Cheapo boards differ from original boards. The maximum serial transfer rate is pretty much only limited by the quality of the board and its layout. Once the serial data enters either AVR or USB interface chip, the data will be processed differently from the serial UART protocol. </p>

<p>Keep in mind though that the microcontroller has some basic hardware to shift in/out serial data to/from the IO pins, but the absolute maximum rate is limited to the 16MHz clock (for AVRs). Once a byte is moved to the serial buffer, the UART hardware will take over and push out / pull in the bits on its own. An AVR at best reaches 16M instructions per second and the interrupts used to fill the serial buffer have some overhead (at least 8 clock ticks for the interrupt handling + instructions to save current state + several instructions for actually filling the buffer). At a given bitrate, the protocol will run at a whopping n bits per second, but your controller needs more time to fill the serial buffer than it needs to actually output the data, resulting in a lower average throughput than you expect and the UART idling for a relatively long time. Disadvantage is the increased probability for bit errors.</p>

<p>Another effect to remember is that all the overhead required to push data out onto UART (or pull it in) cannot be spent in your actual program, again affecting the average practical throughput. You can only use every instruction cycle once, either for filling the buffer or for computing the main loop.</p>

<p>The maximum throughput is therefore dependent on the application you use (how fast is data generated/computed/ready to move to/from the serial buffer) and the actual 'physical' bitrate is only a small part of the design decision.</p>
 160: <p>Error checking is actually very easy and there is an AVR lib that does this in a one liner.     </p>

<p>Read up on  <a href="http://www.nongnu.org/avr-libc/user-manual/group__util__crc.html" rel="nofollow"><code>util/crc16.h</code></a> and you should be good to go in no time with the included examples.</p>

<p>CRC is quite robust and fast for simple applications.</p>
 11: <p>The Arduino Serial Monitor window limits you to 115200, but that's not the highest baud rate capable. You can read the Atmel and the FT232 (or whatever you're using) datasheets to find out the maximum but I am able to successfully use 230400 (twice as fast as the largest the Arduino Serial Monitor supports) with no issues.</p>

<p>If you want to see the results in your computer, you will need another serial monitor that supports other baud rate options. I like <a href="http://freeware.the-meiers.org/">CoolTerm</a> and <a href="http://www.compuphase.com/software_termite.htm">Termite</a>.</p>

<p>Do note that this heavily depends on your clock speed as well.</p>

<p>Here's a <a href="http://www.wormfood.net/avrbaudcalc.php">calculator</a> to help you with calculating what's possible.</p>
 86: <p>There are several factors here:</p>

<ul>
<li>How high of a baud-rate can the ATmega328P MCU achieve?</li>
<li>How high of a baud-rate can the USB-Serial interface achieve?</li>
<li>What is the oscillator frequency on the ATmega328P?</li>
<li>What is the oscillator frequency on the USB-serial interface (if it has one)?</li>
<li>How tolerant is the USB-serial interface of baud-rate mismatch?</li>
</ul>

<p>All of these factors are relevant to determining the maximum achieveable baud rate. The ATmega328P uses a hardware divisor from it's clock-rate to generate the base-clock for the serial interface. If there is no integer ratio from the main clock to the bit-time of the desired baud rate, the MCU will not be able to <em>exactly</em> produce the desired rate. This can lead to potential issues, as some devices are much more sensitive to baud-rate mismatch then others.</p>

<p>FTDI-based interfaces are quite tolerant of baud-rate mismatch, up to several percent error. However, I have worked with specialized embedded GPS modules that were unable to handle even a 0.5% baud rate error.</p>

<p>General serial interfaces are tolerant of ~5% baud-rate error. However, since each end can be off, a more common spec is +-2.5%. This way, if one end is 2.5% fast, and the other is 2.5% slow, your <em>overall</em> error is still only 5%.</p>

<hr>

<p>Anyways. The Uno uses a ATmega328P as the primary MCU, and a ATmega16U2 as the USB-serial interface. We're also fortunate here in that both these MCUs use similar harware USARTs, as well as 16 Mhz clocks. </p>

<p>Since both MCUs have the same harware and clock-rate, they'll both have the same baud-rate error in the same direction, so we can functionally ignore the baud error issue.</p>

<p>Anyways, the "proper" answer to this question would involve digging up the source for the ATmega16U2, and working out the possible baud-rates from there, but since I'm lazy, I figure simple, empirical testing will work.</p>

<p>A quick glance at the ATmega328P datasheet produces the following table:<br>
<img src="https://i.stack.imgur.com/P8kN2.png" alt="enter image description here"></p>

<p>So given the max stated baud-rate of 2 Mbps, I wrote a quick test program:  </p>

<pre><code>void setup(){};

void loop()
{

  delay(1000);
  Serial.begin(57600);
  Serial.println("\r\rBaud-rate = 57600");
  delay(1000);
  Serial.begin(76800);
  Serial.println("\r\rBaud-rate = 76800");
  delay(1000);
  Serial.begin(115200);
  Serial.println("\r\rBaud-rate = 115200");
  delay(1000);
  Serial.begin(230400);
  Serial.println("\r\rBaud-rate = 230400");
  delay(1000);
  Serial.begin(250000);
  Serial.println("\r\rBaud-rate = 250000");
  delay(1000);
  Serial.begin(500000);
  Serial.println("\r\rBaud-rate = 500000");
  delay(1000);
  Serial.begin(1000000);
  Serial.println("\r\rBaud-rate = 1000000");
  delay(1000);
  Serial.begin(2000000);
  Serial.println("\r\rBaud-rate = 2000000");
};
</code></pre>

<p>And then looking at the relevant serial port with a serial terminal:  </p>

<p><img src="https://i.stack.imgur.com/US17S.png" alt="enter image description here"></p>

<p>So it appears the hardware can run at 2,000,000 baud without problems.</p>

<p>Note that this baud rate only gives the MCU <strike>64</strike> 80 clock-cycles per byte, so it would be very challenging to keep the serial interface busy. While the individual bytes may be transferred very rapidly, there is likely to be lots of time when the interface is simply idle.</p>

<hr>

<p>Edit: Actual Testing!</p>

<p>The 2 Mbps is real:<br>
<img src="https://i.stack.imgur.com/APzfe.jpg" alt="enter image description here"><br>
each bit-time is 500 ns, which matches exactly with what is expected.</p>

<p>Performance issues! Overall packet length:<br>
500 Kbaud:
<img src="https://i.stack.imgur.com/rlBti.jpg" alt="enter image description here"></p>

<p>1 Mbaud:
<img src="https://i.stack.imgur.com/9ACpH.jpg" alt="enter image description here"></p>

<p>2 Mbaud:
<img src="https://i.stack.imgur.com/vUDoN.jpg" alt="enter image description here"><br>
<sub>Note: The noticeable overshoot is due to poor scope probe grounding practices, and is <em>probably</em> not real. I'm using the ground-clip-lead that's part of my scope probe, and the lead-inductance is likely the cause of the majority of the overshoot.</sub></p>

<p>As you can see, the overall transmission length is the same for 0.5, 1 and 2 Mbaud. This is because the code that is placing the bytes in the serial buffer is poorly optimized. As such, you will never achieve anything better then an <em>effective</em> 500 Kbaud, unless you write your own serial libraries. The Arduino libraries are very poorly optimized, so it probably wouldn't be <em>too</em> hard to get a proper 2 Mbaud, at least for burst transmissions, if you spent a bit of time on it.</p>
