ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Понедельник
25 ноября
1286050 Топик полностью
Nikolay_Po (22.02.2023 10:58, просмотров: 192) ответил Samx на А чего там думать? Трясти надо!
+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 байта точно хватит.