Any chance serial drops zeros?

Assuming you are dropping 0x00 bytes not ASCII "0" bytes, this problem is likely regardless of your hardware. The serial character is sent as:
space, 8 bits, mark that is:
0, 0000000, 1

The line then stays at 1 until the next character. if you send these very close together the mark time is approximately 1 bit. There is no way to determine if the "mark" - 1 is a mark bit or a "1" in the middle of a data byte. If it looks like it is in the middle of a data byte, it will be discarded as an error since there will not be a mark at the end of the word.

Anyway, if you are not using parity bits, then sometimes you can slow down the transmitting machine. Older systems would sometimes let you specify an "intra character delay" (or something of the sort). What you need is to make sure you never get characters closer together than 10 or 11, bit times, that way the start of the next character is always clear. Parity check or a packet length/parity check would be best.

I have had this trouble sending from a PIC to my PC if I set characters at maximum speed with no delays. I was sending two repeating characters at maximum speed. The PC would sync up in the middle of the character and display two different characters. If I plugged and unplugged the cable, eventually it would start on the right bit boundary and display properly.