I was thinking the invalid data may be do to a timing issue from the arduino reading usart faster than bytes arrive
This is usually the case. But the result is not that Serial.read() returns garbage. Instead it will return -1, meaning that at the time it was called no new (complete) byte had entered the "system" receive ring buffer since its previous call.