Missing bytes in reception probably means that your machine is busy in an ISR or critical section for longer than it takes to receive one byte. I had a similar problem like this recently where the UART RX ISR took too long to figure out what thread was blocking on the RX queue and I missed characters. This problem also went away if I lowered the communication speed.
You need to profile your machine and figure out what part of the code it’s in when characters are being missed. Hook up one channel of a logic analyzer to your UART RX line, and another to a GPIO pin. Set the GPIO pin when you enter your UART RX ISR and reset it when you exit. Then look where the edges of the GPIO signal occur relative to the RX line. This way you’ll be able to tell if your machine is spending too much time in the ISR and is missing characters.
Of course, if you’re running a preemptive kernel, a higher priority interrupt may be taking control of execution, so you may need to use more than one GPIO for debugging.
Not a lot of information to go on, but one solution may be to increase your processor clock speed. The MSP430x2xx family can go up to 16 MHz. If you are already running at the maximum, you will need to rework your code. Remember to keep interrupt service routines as short as possible; you may need to write them in assembler. Use a large enough buffer for the async so that you can process outside of the ISR without losing characters. Global variables may need to be used to facilitate information sharing.
My MCU receives messages at 115200b, and my TIMER_A generates a tick every one ms to count time.
Some of my software modules can hook this tick to manage themselves. Obviously the modules do the less work in this hooked call. But maybe it can be optimised.
Looks like you are doing most of your processing within the interrupt (i.e. calling your functions). The way that this is normally done is that you set a flag to indicate the 1 millisecond event and then exit the ISR. In your main loop, you would check for the flag and if set, clear it and run your routines. The way it is now, once you are in your TimerA0 ISR, no other interrupts will get serviced until you exit the ISR and that is most likely the cause of your missed characters when running at 115.2K