It is strange that nobody knows for sure the blocking semantics of print and println for Serial. There is no word about that on docs.. which is odd.
That's not true, and if you'd read all the responses in this thread, you'd know the answer.
There is a register that holds the value to be/being transmitted. When that register is in use (i.e. has a character in it), Serial.print() needs to wait (i.e. block) until that register is free. So, Serial.print("HaHa") will block until the last a is in the register, then return.
Serial.print("a") may, or may not, block, depending on when it is called with respect to the last Serial.print(), Serial.println(), or Serial.write().
Serial.println(), of course, always blocks, since it is outputting a minimum of three characters (the one or more it is called to output, the carriage return, and the line feed).
Serial.write() may or may not block, depending on how many bytes it is called to output. One byte may or may not, depending on the timing of the call, as in the Serial.print() case.
Serial.write() for more than one byte will block, just as Serial.print() does.
The behavior of Serial.print() is dependent on the behavior of Serial.write(), since all calls to Serial.print() eventually end up calling Serial.write() to do the actual output.
None of this is relevant to your problem, though, since the garbling is not caused by whether or not Serial.write() blocks.