有没有办法不必轮询 AVR 的 UART?

电器工程 avr 嵌入式
2022-02-01 00:32:51

我正在通过 UART 从另一个 AVR 接收数据。但是我正在做其他事情,所以不想不断地轮询 UART。我知道有中断,但我只能看到一个接收完成,我认为这仍然需要我轮询才能完成传输。

2个回答

AVR 上的 RXC 和 TXC(RX 和 TX 完成)都有中断向量。除非您愿意,否则您永远不必轮询这些。

AVRFreaks 对此有一个很好的帖子,制造商也是如此

中断例程将数据存储在缓冲区中(带有 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;
        }
}