Hmmm....
After some trial and error, it seems that the delay time may be biting you.
OK, some basic stuff:
Characters are transmitted generally in a stream and generally at whatever baud rate and generally contiguous.
Cool. But note the "generally".
However, there is slop in the system. This is where the transmitting device pauses, ever so slightly, and then resumes (CPU gets an interrupt for example).
Well the CPU may not pause and transmit faster than you think. So the delay time is now skipping too far into the future.
I would try a shorter delay (much shorter) or buffer more characters in the incoming device.
You seem to be skipping characters on the leading edge of the transmission, correct?
At least, I did when I coded in your routine.
Thoughts?