Могу только предположить что некоторые данные не "умещаются" во один внутренний буфер и поэтому
могут передаваться в 2,3,... вызова.
Прще говоря, надо где-то буфферезировать получаемые данные перед тем как их обрабатывать(не знаю что у вас там является индикатором конца сообщения по логике).