Same thing happened - looks like after it receives the first error it never recovers.
That's certainly disappointing. I expected we were done.
I quickly eyed the code one more time this morning. I'm not seeing anything jump out at me. With the addition of checking for a message in the latest code, my concerns for behavioral ambiguity have been addressed. I'm inclined to say its either a bug in the VirtualWire library or you have a component which is taking things out into left field. Given the board seems to continue running and not really crashing, and all we know is you're getting short reads. I would first look there.
Unless you can readily rule out RF module failure (one to swap out?), I'd start exploring the software route. First of all, add debugging code on your TX side to verify you are, in fact, ALWAYS transmitting at least two bytes per frame. A short TX (one byte) would absolutely cause a false positive on the RX side. So make absolutely sure the TX code isn't the core problem. If after you're absolutely sure its not a false positive on the RX side because of a bug on the TX side, dig into the virtual wire library.
As a side note, I reviewed some of the VirtualWire code. Contrary to the comment, vw_have_message is absolutely not required
. So it makes sense it changed nothing. If you look in vw_get_message, the first thing it does is check the status of the same variable the vw_have_message function does. So NOT calling vw_have_message, as you originally had it, is in fact, ideal. Not calling it was not a bug. That explains why, reportedly, the example code doesn't use it.
Furthermore, the message will be copied regardless of CRC failure. That means technically, any number of bytes will be available on a bad CRC. But, I don't see a mechanism which allows you to discern a receive with bad CRC versus no receive. The implementation details of the vw_get_message are sorta odd, but not likely to be causing your issue.
So in a nut shell, if you'd like, post your TX code. And if you have another RF module to swap out, please do so. Please add a debugging line which reports the size which has been received. Please add debugging lines which report the size which has been transmitted. What is the reported length of the short rx and tx?