Ich denke an der do while schleife. Denn der Vergleich mit 0x00 wird erst zum Schluß durchgeführt.

Code:
while ( *str ) 
{
    uart_send_char ( *str );
    str++;
}
Macht das Gleiche nur, dass der Vergleich im Schleifenkopf stattfindet und damit vor der Übertragung. Des Weiteren werden Strings immer mit einem 0x00 terminiert.