最近用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是两个独立的操作,为什么不能单独停止?
大家有没有类似的经验,应当怎样规避这些坑?
还是说我的做法和理解其实是有问题的?有错误的请大家批评指正,一起学习提高
哥,请问你怎么做的,能给段代码看看吗
正常方法是这样。
但是使用空闲中断也有一个问题,就是的发送端发送一帧数据不能被打断。不然stm32就会触发空闲中断,只接收到一帧的一部分数据。
空闲中断就是这个串口线有一个字节的时间没有数据传输就触发空闲中断吧。
那么假设我发送端要发送一帧数据,共20个字节,那么假设在发送到第10个字节的时候,被中断打断了,打断了之后恢复发送,那么打断到恢复发送这段时间超过了传输一个字节的时间,则就会触发接收端的空闲中断。
则接收端只接收到了10个字节,这个时候在中断里面关闭DMA再开启已经来不及接收后面的了?
这个问题怎么解决的阿?
一周热门 更多>