DMA+串口空闲中断接收数据,是不是不能改接收时间间隔?
请问,DMA+串口空闲中断接收数据,是不是不能改接收时间间隔?也就是说,比如主机给从机发送AT+CMD,等了30ms发了一个OK,我想要这两截数据拼成一包做数据解析,这种用DMA+串口空闲中断接收数据是不是接收不全啊?DMA+串口空闲中断接收数据,是不是不能改接收时间间隔?
对的,我觉得你可以用定时器+串口中断能实现调节接收时间间隔,但你用DMA+串口空闲中断确实不能改变接收每个字节的时间间隔,如果时间间隔不一样,会导致误触发接收一包的问题DMA+串口空闲中断接收数据,是不是不能改接收时间间隔?
可以用DMA接收不定长数据。瑞用环形缓存处理接收的数据,就可以了。 空闲中断触发条件,串口接收完一帧数据后,若在设定的超时时间(如UART的IDLE线检测)内未收到新数据,硬件会触发空闲中断(USART_IDLE)。 超时时间由波特率和采样间隔决定,通常为1个字符时间(如波特率115200时,1字符时间≈8.7μs)。 局限性,空闲中断的触发间隔是硬件固定的,无法直接通过寄存器或配置动态调整。 DMA的辅助作用,DMA在空闲中断触发后,将接收缓冲区(如RX_BUF)中的数据搬运到内存,减少CPU干预。 串口空闲中断确实是靠一段时间没数据才触发的,不能主动设置间隔时间。 你这种场景可以在空闲中断基础上加个超时定时器,控制包的完整性。 DMA + 空闲中断只能被动触发,像你说的30ms间隔要靠应用层处理拼包。 我一般会用一个定时器监测间隔,如果在30ms内有新数据就继续收,否则认为一包结束。 空闲中断只是识别“静默”,并不适合协议里“分段”这种逻辑,要配合软件逻辑拼接。 如果协议分包比较清晰,建议用帧头帧尾识别会更可靠,空闲中断只是辅助工具。 实测确实有遇到数据被分成两段的情况,拼接逻辑很关键。 看你对实时性要求,如果不高也可以考虑先接收缓存,再统一处理。 DMA本身是持续接收的,关键在于空闲中断触发时要看当前DMA计数,别漏了。 最靠谱的方式还是协议设计上定义好帧格式,别依赖间隔来判断包的结束。
页:
[1]