问题1:定时通过DMA发送USART数据包(一个)没有问题,当连续发送多个数据包容易丢包
解决:原程序为数据包发送完成后进入发送完成中断,在中断中将中断完成标志位清零,隔段时间发送一个数据包没有问题,但是频繁的发送多个数据包就会发生上一个还没有发送完成又发送了一个,造成丢包或者部分数据丢失
方法一:关闭发送完成中断将while等待发送完成标志位置一并清零,避免丢包,具体写的内容详看正点原子例程
while(1)
{
if(DMA_GetFlagStatus(DMA2_Stream7,DMA_FLAG_TCIF7)!=RESET)//等待传输完成
{
DMA_ClearFlag(DMA2_Stream7,DMA_FLAG_TCIF7);//清除DMA2_Steam7传输完成标志
break;
}
方法二:不关闭发送完成中断,将所有要发送的数据依次缓存到一个数组中,一起发送出去,也就是一次将多个数据包发送出去,我觉得可能更好,避免无效的等待
问题2:通过DMA串口接收数据,接收后的数据直接DMA串口发送出去,发送后数据清空,发送个数正确,但是只识别到前三个数,剩下的全为0
解决:通过仿真可看到接收的数据正确,单独只发送数据也没问题,发送数据时通过发送完成中断进行标志位清零。后来明白是因为数据还没有发送完成就对数据进行清零了,导致只识别前三个数,可在发送数据命令后添加发送是否完成的判断
while(1)
{pro=DMA_GetCurrDataCounter(DMA2_Stream7);
if(!pro) break;
}
以上的程序是以正点原子的DMA发送例程为参考