Here is a sample program and the support material for interrupt controlled serial USART function.
It uses a circular buffer for both RX and TX. The user can define the buffer size.
It uses interrupts instead of the polled method. This allows the serial communication to occur in the background unless you have run out of buffer space on the transmitter, in which case it will wait until the buffer has space.
The modules were obtailed from various on-line sources and have their author's credits.
I made some mods to the uart2.c subroutines, and it now supports program memory-based strings.
Some of them use rather old syntax, so some support header files are needed to make new compilers happy. This was compiled under WinAVR 2006-0125. GCC version 3.4.5
-Tony