问一个关于串口DMA的问题,感觉和串口接收缓冲区有关。
最近在做一个项目,要用串口接收固定40个字节的数据,每隔10ms40个字节的数据。
但是接收数据之前要用串口发命令给设备,请求这些数据,发送请求的时候,设备也会回复几个字节的应答。
当发送完请求的命令后,收到指定的回复(3个字节)后,每隔10ms就会有40个字节的需要的数据通过串口发回来。
但是前面发送的命令和回复的应答都是4、5个字节,所以我没用DMA,而是直接用串口接收中断。
当在串口接收终端中接收到正确的回复后,马上开启DMA模式,用DMA接收数据,DMA接收完成中断一次,就接收到40个字节。
比如发送命令 char command[ ] = { ‘s','e','n','d' } 4个字节, 接收到 char respond[] = { ' s' , 'e', 'n', 'd', 'o','k'} 6个字节,
然后设备就一直发送40字节的数据。
问题来了,我把DMA的计数设置成40,然后开启的时候,第一次的DMA中断的第一个字节收到的是之前应答的最后一个字节’k',然后才是40字节的数据, 所以接收到39字节数据时就DMA中断了,最后一个字节又到下一次DMA中断才收到。
后面的所有DMA中断都会因为这个原因而错开1字节。但是我在串口中断中已经接收了最后一个字节了(确实接收到了,usart_receive 了最后一个字节了),为什么开启DMA时还会接收到最后一个字节 (我也尝试过开dma前执行一遍 usart_receive(USART),也不行) 。
可能是最后一个字节还留在缓冲区里(我猜想)?,所以有什么办法可以清空串口接收缓冲区吗?
后面我的解决办法是第一次开DMA时,把DMA计数加1 ,即41, 然后在中断中重新设置DMA计数为40,这样是把问题解决了,就是第一组数据丢弃了。
不过我还是想知道是什么原因,是缓冲区问题吗,还是别的?所以来这里求助一下,看看有没有遇到相同问题的,或者有对stm32了解深入一点的大神解答下,谢谢!!
|