HAL库的串口DMA接收一旦溢出就会丢数据

2019-07-14 14:38发布

最近用HAL库做个单工的无线串口,因为无线通信是阻塞的,就用串口的DMA接收函数HAL_UART_Receive_DMA。

实际用的时候发现很多问题:
1.串口接收一旦溢出就会丢数据。
例如串口接收满了,稍等几秒再启动新的DMA接收函数HAL_UART_Receive_DMA时,就丢失数据了,而且是再也收不到串口数据。如果接满后马上启动就没这个问题。
看官方示例代码,停止DMA接收后似乎要DeInit后重新初始化Init和启动DMA接收

2.串口DMA接收不能单独停止。
例如串口同时在DMA发送和DMA接收,DMA接收到一半我要终止DMA的话,只能调用HAL_UART_DMAStop把接收DMA和串口DMA都停止。
换言之,不能单独停止DMA接收。
我理解的接收DMA和发送DMA是两个独立的操作,为什么不能单独停止?


大家有没有类似的经验,应当怎样规避这些坑?
还是说我的做法和理解其实是有问题的?有错误的请大家批评指正,一起学习提高
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
18条回答
youpukeji668
1楼-- · 2019-07-14 20:26
 精彩回答 2  元偷偷看……
ctwewer
2楼-- · 2019-07-15 01:24
你应该用DMA中断将数据移到缓冲区
tiantian55
3楼-- · 2019-07-15 07:17
youpukeji668 发表于 2019-1-11 06:31
我刚做过用串口DMA接收不定长数据,使能空闲中断,在空闲中断触发的时候停止DMA,取出数据,之后使用HAL_UART_Receive_DMA重新接收没有问题。(没有DeInit和Init)
2,HAl的库函数HAL_UART_DMAStop确实是同时关收发DMA,如果只关一个的话可以直接操作寄存器。至于只关一个会不会出问题就不知道了; ...

DMA停止后,HAL_UART_Receive_DMA执行前,如果串口有数据接收就会出问题。我测试时就是这种情况。

那我试试直接操作寄存器。多谢你的建议
tiantian55
4楼-- · 2019-07-15 10:48
ctwewer 发表于 2019-1-11 06:47
你应该用DMA中断将数据移到缓冲区

的确这也是一种方法
tiantian55
5楼-- · 2019-07-15 11:38
充电搜索 发表于 2019-1-11 06:20
当你将接收DMA关闭后,此时串口还是激活的,若此时串口来数据,无法触发DMA传输,此时产生上溢错误(ORE),由于串口数据寄存器里的数据不能及时转移走,后面来的数据就进不来。一旦出现这种错误后,就不会再触发DMA请求,即使再开启DMA也不行。要恢复正常的话就只有Deinit后再重新初始化串口,或者使用read接口直接将数据 ...

这下算是完全明白了,多谢多谢
shinovo
6楼-- · 2019-07-15 12:20
 精彩回答 2  元偷偷看……

一周热门 更多>