Ответ: Вот как я это делаю:
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
}
)