Добро, зло... Гесер, Завулон... Эх... Вы, господин так ничего и не поняли... Специально потратил время на попробовать...
код
void puts11(const char *Mes, int Len)
{
int i;
for(i=0; i<Len; i++, Mes++)
{
while (!(U1LSR & ULSR_THRE));
U1THR = *Mes;
while (!uart1TxEmpty()) while (!(U1LSR & ULSR_THRE));
};
}
работает корректно. Полностью корректно.
код
void puts11(const char *Mes, int Len)
{
int i;
for(i=0; i<Len; i++, Mes++)
{
while (!(U1LSR & ULSR_THRE));
U1THR = *Mes;
};
}
Который собсно и есть то, что Вы предложили - работает некорректно, поскольку не отслеживает правильно опустошение буфера передачи, почему - отдельная тема, но так есть. Проверь то, что Вы написал

в работе, хотя-бы на симуляторе, убедишься. Застревает последний байт сообщения.
Понимаю конечно, что ваш вариант передачи полностью передран из примеров и верен по определению, но надо иметь и воображение.
Добро... Зло... Хвост!!!