我正在通过 UART 从另一个 AVR 接收数据。但是我正在做其他事情,所以不想不断地轮询 UART。我知道有中断,但我只能看到一个接收完成,我认为这仍然需要我轮询才能完成传输。
有没有办法不必轮询 AVR 的 UART?
电器工程
avr
嵌入式
2022-02-01 00:32:51
2个回答
中断例程将数据存储在缓冲区中(带有 put 和 get 指针的循环缓冲区工作得很好)。主循环检查缓冲区中是否有数据,如果有,将其取出。主循环可以做其他事情,但需要在中断缓冲区溢出之前(当 put 遇到 get 时)检查并删除数据。
它不会编译,但这说明了该方法。
char circ_buf[BUFFER_SIZE];
int get_index, put_index;
void initialize(void) {
get_index = 0;
put_index = 0;
}
isr serial_port_interrupt(void) { // interrupt
circ_buf[put_index++] = SERIAL_PORT_REGISTER;
if(put_index==get_index) error("buffer overflow"); // oops
if(put_index==BUFFER_SIZE) put_index = 0; // circular buffer
}
void background routine(void) {
while(put_index!=get_index) { // or if()
ch = circ_buf[get_index++];
// do something with ch
if(get_index==BUFFER_SIZE) get_index = 0;
}
}
其它你可能感兴趣的问题