Прежде всего, какое устройство Pic вы используете, потому что это немного меняет дело.
Также какой компилятор вы используете.
Однако причина того, что ваш код работает, заключается в том, что все, что вам нужно сделать для передачи по каналу uart, находится в банке 0. Ваши записи в порт b ничего не делают. Я предполагаю, что вы хотите переключить trisb, а это в банк 1 но поскольку уарт имеет контроль над выводом, записывающим в порт B, он сам по себе не имеет никакого эффекта. Во втором примере вы опрашиваете то, что вы считаете TXSTA, но оно находится в банке 0, а не в банке 1. Я предполагаю, что вам повезло, если вы опрашиваете неправильное местоположение, и бит всегда находится в правильном состоянии, поэтому цикл завершается.
Когда я делаю передачу, я предпочитаю сначала посмотреть, пуст ли уарт, дождаться его и затем отправить символ. Не нужно ждать окончания передачи, если только вы не хотите использовать прерывание, например, чтобы получить следующий символ.
Таким образом, оба фрагмента кода работают, потому что вы находитесь в банке 0 в обоих случаях, когда выполняете movwf TXREG. Все остальное обрабатывается аппаратно для вас.
Edit:
Теперь, когда я знаю, что вы правы в том, что TXSTA находится в банке 1. Вы через меня, потому что у вас был комментарий по адресу 0x18, и он должен быть 0x98. В первом примере вы опрашиваете бит 1 RCSTA, который является OERR, а не TXSTA. Так что, если это работает, это означает, что OERR = 1, что очень возможно, я обычно очищаю его, когда делаю что-нибудь с получателем.