Getting incomplete data is not so surprising; Not all bytes may have already arrived at the input buffer, so you'll get the ones that are already in and leave the ones that are yet to be written to the input buffer.
And how do you know that it IS in the mscomm.input, but not put in the string? That is impossible. Are you maybe watching this property by hovering the mouse over it or something like that (which will clear the property....)
Do you know upfront how many characters must be arived in the input buffer for the string to be complete? Or is there maybe a terminating character? Better wait for the number of chars then, or the terminating character....
And last, but not least:
Why are you using a counter in the loop? Wouldn't a timeout in milliseconds be a better solution?
Greetings,
Rick