+1 за приём байт в прерывании и укладку их в буфер.
Что-то вроде этого (размер буфера RxSize = 2^N):
ISR(USART0_RX_vect) { //Receive interrupt. Puts received data into Rx FIFO.
uint8_t Char = UDR0; //Get character from USART shift register ASAP
if (!Serial.RxIsFull) { //Check for Rx buffer free space
//There is a free space. Put received character into Rx FIFO
RxBuff[RxPutIdx++] = Char;
RxPutIdx &= RxSize - 1; //Loop put index in circle
if (RxPutIdx == RxGetIdx) { //Check if Rx buffer is full
//No free space remaining for next received character
Serial.RxIsFull = 1; //Set Rx full flag
}
} else {
//New character arrived when Rx buffer was already full
Serial.RxOverrun = 1; //Set overrun flag
UCSR0B &= ~(1 << RXEN0); //Disable the receiver to not bother MCU
//Drop character. SerialFlushRx() is needed to re-enable reception.
}
}
Сюда же можно вставить проверку свободного места в буфере, типа:
if(((RxGetIdx-RxPutIdx)&(RxSize-1))<(RxSize/2)){ //Проверяется вообще по одному, старшему биту разности
Снять_Сигнал_Готовности_К_Приёму();
} И размер буфера 32 байта, для стандартного RS-232 должно хватить. Ну, 64 байта точно хватит.