Du versuchst printf-Funktionalität nachzubilden, tust es aber nicht.
Zwar ist Dein uart_puts so deklariert, daß es eine variable
Argumentenliste übergeben wird, diese aber wertest Du nicht aus, was Du
aber tun müsstest, wenn Du willst, daß beispielsweise "%i" durch einen
numerischen Wert ersetzt wird.
Da Du sicherlich nicht printf() neu erfinden möchtest, solltest Du hier
mit snprintf() in einen Puffer schreiben und diesen dann mit einem
uart_puts wie Deinem ausgebeverwenden, das Du nur von der Ellipse (den
drei Punkten) im Prototypen befreien musst.
Möchtest Du sozusagen ein eigenes printf() bauen, das auf die uart
ausgibt, kannst Du entweder die stdio-Ausgabefunktionen umbiegen (ist im
Umfeld Deiner C-Library dokumentiert) oder aber ein uart_printf()
schreiben.
Das muss dann die Funktionen va_start() und va_end() verwenden und
vsnprintf() aufrufen -- sofern das die von Dir verwendete C-Library
hergibt.