Ну, а уж если все таки приспичило, можно в putchar ввести глобальный флаг и переключать его в функции, которая вызывает printf, и которая знает, в какой интерфейс будет идти сообщение...
Код
char g_putcharMode = 0;
...
int putchar(int c)
{
switch(g_putcharMode)
{
case USART0_MSG:
...
break;
case USART1_MSG:
...
break;
case SPI_MSG:
...
break;
...
}
return 0;
}