Ответ: Вот как я это делаю:
static void Uart1Isr(void) { char isr; char c; while(1) { isr = U1IIR & 0x0f; if(isr == 2) // прерывание по передаче { if(U1LSR & 0x20) { // Если CTS установлен можно работать if((U1MSR & 0x10)!=0) { register int i; for (i=12;i>0;i--) // пытаемся отправить сразу 12 байт { if(CircBuffer_GetChar(&U1TxBuffer,&c)) // если есть что передавать { U1THR = c; Uart1Error.TxBytesSent++; } // передаем else { U1IER = 0x0d; break; // выходим из цикла }; // если нечего передавать запрещаем прерывания }; }; }; continue; }; if((isr==4)||(isr==0x0c)) // прерывание по приему или таймауту { while(U1LSR & 0x01) //-- while Rx FIFO is not empty {// надо записать байт в приемный буфер if(CircBuffer_AddChar(&U1RxBuffer, U1RBR)==0) Uart1Error.RxBuffOvrErr++; // контроль на переполнение входного буфера Uart1Error.RxChars++; }; continue; }; if(isr == 6) // ошибка приема { register char LSR= U1LSR; register TUartError * E=&Uart1Error; if(LSR&0x02) E->RxFifoOvrErr++; if(LSR&0x04) E->ParityErr++; if(LSR&0x08) E->FrameErr++; if(LSR&0x10) E->BreakErr++; continue; }; if(isr == 0) // изменение в MSR { if(U1MSR & 0x10) // если линия CTS перешла в активное состояние {// надо возобновить передачу если в буфере есть что передавать if(CircBuffer_GetChar(&U1TxBuffer,&c)) // если есть что передавать { U1IER = 0x0f; // разрешим прерывания по передаче U1THR = c; Uart1Error.TxBytesSent++; }; // передаем } else { // наче запретим прерывания по передаче прекратив передачу U1IER = 0x0d; }; continue; }; //если никакое прерывание не опознано - вываливаемся break; }; // while }