Hi Rod,
when you work with streams, there's no guarantee that what is sent as a block (if I understood correctly, the 20 bytes) will always be received as such, even if with some devices it works this way.
Probably, (or at least the reception must be prepared for it) it will be received in more than one event, so you should provide a way (a timeout and/or some sort of frame delimiter) to re-build valid frames on a separate buffer based on the received fragments and known rules (fixed length, minimum time distance between frames, known bytes at the beginning/end, ...)