# km4的UART0有没有Rx空闲中断

**URL:** <https://forum.amebaiot.com/t/km4-uart0-rx/1698>\
**Category:** Peripherals\
**Tags:** uart, rtl872xd\
**Created:** [February 3, 2023, 9:30am UTC](https://forum.amebaiot.com/t/km4-uart0-rx/1698 "2023-02-03T09:30:36Z")\
**Posts on this page:** 5\
**Page:** 1

<div class="post-metadata">

**Author:** ![oxygenben](https://avatars.discourse-cdn.com/v4/letter/o/4bbf92/32.png) [@oxygenben](https://forum.amebaiot.com/u/oxygenben)\
**Post date:** [February 3, 2023, 9:30am UTC](https://forum.amebaiot.com/t/km4-uart0-rx/1698/1 "2023-02-03T09:30:36Z")

</div>

![image](https://us1.discourse-cdn.com/flex016/uploads/ameba/original/2X/7/7dc6c558e080e2a55b8f97fd9241cda05a3e9a56.png)  
用的芯片是RTL8722DM，如果没有Rx空闲中断的话，如何判断一帧不定长的数据已经接收完？

---

<div class="post-metadata">

**Author:** ![wyy](https://avatars.discourse-cdn.com/v4/letter/w/bc8723/32.png) [@wyy](https://forum.amebaiot.com/u/wyy)\
**Post date:** [February 6, 2023, 3:10am UTC](https://forum.amebaiot.com/t/km4-uart0-rx/1698/2 "2023-02-06T03:10:26Z")

</div>

`RUART_IER_ETOI` 应该是你要的空闲中断，空闲时间是在 `REG_RX_PATH_CTRL` 里面的 `RX_TIMEOUT_THRES` 设置。

可以参考[这一页](https://github.com/ambiot/ambd_sdk/tree/dev/project/realtek_amebaD_va0_example/example_sources/UART/raw)里的 `uart_irq`, `uart_stream_irq`, `uart_stream_rx_timeout` 都有用到 `RUART_IER_ETOI`.

---

<div class="post-metadata">

**Author:** ![oxygenben](https://avatars.discourse-cdn.com/v4/letter/o/4bbf92/32.png) [@oxygenben](https://forum.amebaiot.com/u/oxygenben)\
**Post date:** [February 8, 2023, 8:24am UTC](https://forum.amebaiot.com/t/km4-uart0-rx/1698/3 "2023-02-08T08:24:56Z")

</div>

![image](https://us1.discourse-cdn.com/flex016/uploads/ameba/original/2X/8/80a61b21c6750ba476fc5af98bcda155aa0d4d8a.png)  
左边是在中断里打印的中断ID，没有RUART\_TIME\_OUT\_INDICATION。  
用的例程是uart\_irq修改的，修改后的代码如下。  
 ![image](https://us1.discourse-cdn.com/flex016/uploads/ameba/original/2X/b/b250320616630f2636b058d23d0298fbc6e352b0.png)  
这个RUART\_IER\_ETOI是否只在DMA模式下才有效？

---

<div class="post-metadata">

**Author:** ![wyy](https://avatars.discourse-cdn.com/v4/letter/w/bc8723/32.png) [@wyy](https://forum.amebaiot.com/u/wyy)\
**Post date:** [February 14, 2023, 5:19am UTC](https://forum.amebaiot.com/t/km4-uart0-rx/1698/4 "2023-02-14T05:19:26Z")

</div>

@oxygenben

对不起是我理解错了，`RUART_IER_ETOI` 并不是你想要的空闲中断。它的功能更像是提醒有收到的数据还没读取。

 ![Screenshot 2023-02-14 131114](https://us1.discourse-cdn.com/flex016/uploads/ameba/original/2X/6/637e1870aa8a34212ecd74da5749ddd5a0c74659.png)

> [@oxygenben](#):
>
> 如何判断一帧不定长的数据已经接收完

如果你的发送端能够保证一帧内的每个数据发送之间的时间都不会太长，可以在接收端计时，每次收到数据就重置计时。计时一旦超过一定的时间，就可以判断一帧已发送完。

---

<div class="post-metadata">

**Author:** ![oxygenben](https://avatars.discourse-cdn.com/v4/letter/o/4bbf92/32.png) [@oxygenben](https://forum.amebaiot.com/u/oxygenben)\
**Post date:** [February 21, 2023, 9:00am UTC](https://forum.amebaiot.com/t/km4-uart0-rx/1698/5 "2023-02-21T09:00:06Z")

</div>

非常感谢提供另一种思路，自己尝试用时长来做空闲中断，但是效果不是很理想。现在尝试用DMA进行开发。
