Как работает этот промывочный код 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, а это не ноль, цикл будет введен при установке бита.

Другие вопросы по тегам