I was not to reply to this, but here it goes.
Most serial errors occur during reception, not transmission. RS232 is asynchronous, meaning the clock is not sent along data. Although you can have both clocks with same frequency at high levels of accuracy, their phase difference is not known. This might lead to metastability problems (errors). To overcome that, most UART do oversampling on the receiver side (tipically 16). This means that for each bit being extracted, you sample 16 times. If your clock is 16MHz, your bit rate hardly goes over 1Mbit, if you want a clear transmission.
Let me try to explain how the UART receiver works.
As you know, RS232 transmission uses 1 start bit, 7-8 data bits and 0-1 stop bits. And might use parity. Let's concentrate on 8N1 (8 data bits, no parity, 1 stop bit).
So the receiver is idle, sampling 16x times faster than its baud rate, and reads a logical '0' on the wire. It keeps on going until he reads a '1'. Here it "synchronizes" its clock.
Let's assume transmission is like this: 1 01010101 1 (startbit and stopbit included).
If '1' came at sampling time N, the start bit, then the first bit of data will be sampled exactly in between its start and its end - after 16 + (16/2) cycles - 1.5 bit time (includes the start bit). This ensures best setup time and hold time (setup time is the amount of time required for a signal to be stable to be sampled, hold time the amount of time required after sampling). Then others are sampled at each 16 cycles.
if your baudrate does not allow for proper center alignment, then you won't meet either setup time or hold time. If you are sampling zeroes and ones you can try resynchronizing the clock phase, but that is not used usually.
At higher baud rates, capacitance on the transmission lines shows up, greatly affecting sample+hold time. So you need a lot of precision when sampling the data bits.
Hope I shed some light on the subject. Feel free to ask for clarifications.
Álvaro