Dann müsstest Du noch mal Deine Baudratenberechnung überprüfen - obwohl die eigentlich korrekt aussieht. Arbeitest Du mit internem Takt? Der kann durchaus schon mal ein ganzes Stück daneben liegen. Dann müsstest Du mal versuchen, den Wert für das UBRR0 Register manuell anzupassen und ein paar Werte nach oben bzw. unten korrigieren. Wenn Du ein Oszilloskop zu Hand hast, kannst Du das ganze auch mal nachmessen - würde die Sache sehr vereinfachen.

Eins habe ich noch vergessen: Ganz korrekt müsste die Senderoutine so aussehen. Eventuell ist das schon der Grund für Deinen Datenmüll:
Code:
void uart_tx(uint8_t c) {
while ( !(UCSR0A & (1<<UDRE0)) ) //warte, bis Senderegister leer ist
    UDR0 = c ; //senden
}
askazo