I remember this....
Anyways, one of the things I suggested was to send a bunch of preamble bytes, wait until you received a bunch, switch to checking for another byte, waiting for that one, then getting your data.
In your program, you send 4 $55's as the preamble. That's good amount for a preamble. I think the problem might be that on your receiver, you also wait for 4 $55's. It takes a little bit of time for those $55's to do their thing, to get the receiver's attention if you want to call it that. In other words, you send 4, but you might only get 2 at the receiver.

Either try sending more than 4 $55's on the transmitter, and leave your receiver code the same, or try looking for only 2 $55's in your receiver and leave the transmitter the same.