Как работает этот промывочный код USART c?
Итак, у меня есть старый код, который я просматриваю, и который я должен обновить для нового микроконтроллера. В старом коде есть функция очистки USART на случай, если с самого начала на нем будет мусор. Код ниже:
#define RXC 7
#define RX_COMPLETE (1<<RXC)
void UART1_FLUSH(void){
unsigned char dummy;
while ( UCSR1A & RX_COMPLETE ) dummy = UDR1;
}
Теперь, насколько я понимаю, цикл while будет продолжать работать до тех пор, пока что-то будет считано из USART из регистра UDR1, поэтому оно хранится в фиктивной переменной, поскольку нам это не нужно. Теперь мне нужна помощь в объяснении, почему цикл while работает так, как работает?
1 ответ
Ищите UCSRnA в http://upcommons.upc.edu/pfc/bitstream/2099.1/10997/4/Annex3.pdf котором код просто ожидает, пока бит 7 ("RXCn: USART Receive Complete") в USCR1A выключен.
Этот документ говорит о бите 7 Этот бит флага устанавливается, когда в приемном буфере есть непрочитанные данные, и очищается, когда буфер приема пуст.
(1<<RXC)
это числовое значение бита 7. Побитовое И (&
) между ним и значением, считанным из UCSR1A, приводит к 0 (если бит выключен) или (1<<RXC)
(если бит включен). Поскольку (1<<7) равно 128, а это не ноль, цикл будет введен при установке бита.