串口中断的3种方式
轮询、中断驱动、异步
轮询API
uart_poll_out(), uart_poll_in(),没什么好讲的。在接收下如果寄存器无数据则返回-1
中断驱动API
基本来说,注册一个中断服务函数,需要发送的时候调用uart_irq_tx_enable(),并在服务函数里检查标志位(需要uart_irq_update(),uart_irq_tx_ready())。,然后填充数据到fifo里。
接收需要先irq_rx_enable(), 然后数据到达时,在中断里接收数据(风险:接收到的会是一整帧么?)
异步API
使用缓冲区+回调函数进行UART通信。
1. 要开始接收,必须使用第一个缓冲区调用uart_rx_enable;
2. 当接收到数据时,回调函数会请求第二个缓冲区(触发#UART_RX_BUF_REQUEST事件)
2.1. 可使用uart_rx_buf_rsp()提供第二个缓冲区,或直接忽略。(这样当当前缓冲区填满时,将生成#UART_RX_RDY事件并停止接收)
3. 当数据接收完成后(接收到最后一个字节并一段时间内没有新字节被接收到),触发#UART_RX_RDY。
4. 如果缓冲区满了,将生成#UART_RX_RDY事件,紧接着是#UART_RX_BUF_RELEASED事件,指示当前缓冲区不再使用。(风险:如果一个包还未接收完成,触发第一个缓冲区的RX_RDY会发生什么?)
4.1. 如果提供了第二个缓冲区,自动切换过去,并请求一个新的缓冲区。
4.2. 如果没有提供第二个缓冲区,触发#UART_RX_DISABLED。
5. 任何时候都可能触发#UART_RX_STOPPED事件。如果此时UART接收了一部分数据,会触发#UART_RX_RDY事件;然后触发#UART_RX_BUF_RELEASED;然后触发#DISABLE.
发送:
a. 使用uart_tx()进行异步发送,如果全部传输,触发#UART_TX_DONE,否则(如流控中超时)触发#UART_TX_ABORTED。可以使用uart_tx_abort()终止传输,并触发#ABORTED