问题描述:
1.串口接收一旦溢出就会丢数据。
串口接收满了,稍等几秒再重新启动DMA接收函数HAL_UART_Receive_DMA()时,就会丢失数据,而且此时串口接收空闲中断启动正常,打印出来会发现全是’\0’。如果接满后马上启动就没此问题。
2.串口DMA接收与发送不能单独停止。
如果串口同时进行DMA发送和DMA接收,在DMA接收到一半我要终止DMA时,只能调用HAL_UART_DMAStop()把接收DMA和发送DMA都停止,不能单独停止DMA接收。
原因分析:
当你将接收DMA关闭后,此时串口还是激活的,若此时串口来数据,无法触发DMA传输,此时产生上溢错误(ORE),由于串口数据寄存器里的数据不能及时转移走,后面来的数据就进不来。一旦出现这种错误后,就不会再触发DMA请求,即使再开启DMA也不行。
解决方案:
官方示例是deinit后再重新初始化串口,或者使用read接口直接将数据寄存器中的数据读走后,后面的数据才能正常进入,从而正常产生DMA请求,这个DMA请求是指硬件请求。
亲测解决方法:将HAL_UART_DMAStop()替换成HAL_UART_AbortReceive(),此函数是只关闭DMA接收的函数。