quello del blocco del programma era un problema noto, molto discusso sul forum Microchip, ma solo in fase di simulazione. Con l'MPLAB SIM non c'era verso di farlo andare. Io avevo infatti risolto così:
#define SIM 1
#ifndef SIM
while (OSCCONbits.COSC != 0b011); // Wait for Clock switch to occur
while(OSCCONbits.LOCK!=1) {}; // Wait for PLL to lock
#endif
commentando la define lo usavo nel normale funzionamento. Con #define SIM 1 attivo facevo il debug in SIM.
Poi, aggiornando aggiornando MPLAB e C30, un giorno mi sono dimenticato di "discommentare" la define e tutto ha funzionato anche in SIM. Non ho più cercato sul forum ma probabilmente il problema è stato risolto.
Per quanto riguarda la comunicazione, se ti può consolare, io ci passai un'intera domenica per farla funzionare in mezzo a quella marea di registri non tutti spiegati molto bene, anche perché mi ero impuntato a capirli tutti

la demo sul manuale non mi aiutò granché, anzi...
Non ho analizzato bit a bit il tuo codice, ho fatto una rapidissima comparazione rispetto alla mia configurazione e, per ora, ho trovato solo una differenza sul flow control. Ti allego la mia config, questa funziona.
Io uso il DMA per la parte di trasmissione, se ti va di leggere un po' trovi l'intero programma sul mio sito
Ho perso anche un po' di tempo sulla formuletta per calcolare BRG.
All'inizio avevo fatto un casting esplicito a long della define BAUDRATE (la trovi ancora così sulla versione nel sito) altrimenti mi troncava certi valori e non calcolava bene il valore.
Ora ho messo un quarzo a 10MHz invece che a 7.3728 (con il quale i conti per la seriale venivano precisissimi). Con quello a 10 ho usato addirittura due float in modo da poter fare (come vedi nell'esempio) l'approssimazione del calcolo all'intero più vicino, in questo modo la precisione del calcolo rimane sempre migliore dell'1%.
Spero di esserti stato un po' di aiuto.
void UsartSetting(void)
{
/*---------------------------------------------------------------------------*/
/* USART1 [6] */
/*---------------------------------------------------------------------------*/
float BaudRate;
float BRG;
/* Baud Rate = Fcy / ( 4 * (UxBRG + 1) ) with BRGH = 1
value for the U1BRG register rounded to closest integer (+0.5)
*/
BaudRate = 57600; // desired baud rate
BRG = (FCY/(4*(BaudRate)))-0.5;
/*................................................. ..............DMA UART TX */
// Associate DMA Channel 6 with UART Tx
DMA6REQ = 0x000c; // Select UART1 Transmitter
DMA6PAD = (volatile unsigned int) &U1TXREG;
DMA6CONbits.SIZE = 1; // Transfer bytes
DMA6CONbits.DIR = 1; // Transfer data from RAM to UART
DMA6CONbits.HALF = 0; // Interrupt when all of the data has been moved
DMA6CONbits.AMODE = 0; // Register Indirect with Post-Increment
DMA6CONbits.MODE = 1; // One-Shot mode
//DMA6CNT = 31; // # of DMA requests
// Associate one buffer with Channel 6 for one-shot operation
DMA6STA = __builtin_dmaoffset(UartTxBuff);
// Enable DMA Interrupts
IFS4bits.DMA6IF = 0; // Clear DMA Interrupt Flag
IEC4bits.DMA6IE = 1; // Enable DMA interrupt
/*................................................. ..............DMA UART TX */
/*................................................. ....................USART */
U1MODEbits.STSEL = 0; // 1-stop bit
U1MODEbits.PDSEL = 0; // No Parity, 8-data bits
U1MODEbits.ABAUD = 0; // Autobaud Disabled
U1MODEbits.RTSMD = 1; // No flow control
U1MODEbits.BRGH = 1; // Hi speed
U1BRG = BRG; // BAUD Rate Setting
// Configure UART for DMA transfers
U1STAbits.UTXISEL0 = 0; // Interrupt after one Tx character is transmitted
U1STAbits.UTXISEL1 = 0;
U1STAbits.URXISEL = 0; // Interrupt after one RX character is received
// Enable UART Rx and Tx
U1MODEbits.UARTEN = 1; // Enable UART
U1STAbits.UTXEN = 1; // Enable UART Tx
IEC4bits.U1EIE = 0;
_U1RXIF = 0; // Reset RX interrupt flag
_U1RXIE = 1; // Enable RX interrupt
UartRxStatus = 0;
ChkSum=0;
/*................................................. ....................USART */
}