Das [20] bei char[20] definiert die Länge eines Arrays vom Typ char.

\0 ist nur das Null-Zeichen aus dem ASCII-Standard. Das wird benutzt um das Ende eines String (Zeichenkette) oder eines Arrays ( auch eine Zeichenkette wenn vom Typ char) zu erkennen.

Sprich irgendwann hat man sich darauf geeinigt, dass \0 die Zeichenfolge abschließt. Was aber nicht automatisch heisst, dass eine Zeile auch beendet wird. Das macht man je nach System mit einer Variation von \r oder \n, also Linefeed und Carriage-Return.

Versuch doch mal mittels deiner UART Funktion das Folgende :
uart_write ("Hallo\r\n") und stell bei hterm als Zeilenende CR+LF ein.