nRF Connect SDK & Zephyr RTOS UART概念解释

串口中断的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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值