最近在做个上下位机通讯的自定义协议,思路如下: (1)通过状态机的方法分析数据包,提取需要的信息,这部分是采用【USART1中断接收模式】做的。 (2)分析数据包内固定位置的【数据长度】信息,在数据包最后一个字节到来并触发【USART1中断服务程序】的时候,在【USART1中断服务程序】中【启动DMA接收之前取得的“确定长度”的数据,同时失能USART1的中断】 (3)在DMA接收完毕后【自动进入DMA中断服务程序,并重新使能USART1的中断】。 然后问题就出现在(2)上面,由于这个USART1中断是通过数据包的【最后一个字节的到来】而被触发的,所以进入USART1中断服务程序时,我所用的临时变量读到的就是这【最后一个字节】,而同时,DMA也是在此开启的,我将DMA配置为非循环,每次使用前先Disable并重新配置后再Enable,然后比如设为读10个数据,存入缓冲区TEMP[]中,实际硬件调试中通过串口的输出,我发现TEMP[0]中存放的就是之前提到【最后一个字节】,TEMP[1]~TEMP[9]中是正确的前9个数据,第10个数据不翼而飞...因为在第9个数据被读入时已经进入【DMA中断服务程序】了... 所以搞得现在要在原来的帧中加了个“流水号”(实为凑数的字节),同时若要收10个数据,我就将长度设为11,收到的就是10个正确的...这么下来貌似一切正常了,但明显这是在掩盖问题...因此希望能了解下到底是怎么回事.. |