Solange du keine Threads verwendest, werden die Timer-Funktionen aus der
Event-Loop heraus aufgerufen. Und wenn du bereits in einer anderen, aus
der Event-Loop gestarteten Funktion bist, und nie in diese zurückkehrst,
eben nie.
Nimm lieber ein
System.Threading.Thread.Sleep(10);
Auch unschön, weil solange die GUI blockiert ist, aber funktioniert
wenigstens...
Trotzdem mieser Stil.
Edit: Das mit dem "funktioniert wenisgstens" relativiert sich, je
nachdem wo du deinen uart_str_rx - Buffer befüllst. Wenn das auch als
Event-Handler in der Main-Loop passiert, klappt es trotzdem nicht.