+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 байта точно хватит.