通过DMA控制USART发送数据丢包

问题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发送例程为参考

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: FreeRTOS是一个常用的嵌入式系统实时操作系统,它提供了多任务支持、时钟管理、任务切换等常见的操作系统功能。USART是串行通信接口,用于实现串行通信,DMA是直接内存访问。在使用FreeRTOS和USART进行数据发送时,如果使用DMA进行发送,可能会出现数据的情况。 造成数据的原因可能有很多,其中最常见的是DMA传输速度不能跟上CPU时间的速度,导致失部分数据。此时,可以通过调整DMA的传输速率或者增加内存大小的方式来解决。另外,还有可能是在数据发送过程中由于任务优先级的问题导致数据被中断,甚至任务切换时出现了问题,需要通过分析硬件、调整任务优先级等方式来解决。 为了避免数据问题,建议在使用FreeRTOS和USART进行数据发送时,需要注意以下几点: 1、配置好DMAUSART的中断使能和优先级设置。 2、DMA发送速率要保证跟上CPU的时间,避免数据失。 3、设置好任务优先级,优化任务调度,防止数据发送时被中断或间隔。 4、增加校验处理,保证数据发送的准确性和完整性。 在实际开发中,需要根据具体情况调整以上几个方面,以保证USART数据发送的准确性和稳定性。 ### 回答2: FreeRTOS是一个基于RTOS的嵌入式系统,它支持多个处理器安装,包括ARM,MIPS,PIC32等。USART是通用同步异步收发传输器的英文缩写,它是嵌入式系统中用来管理串行通信的基本部件。DMA是直接存储器访问的英文缩写,用于在系统内存和外设之间传输数据。 当使用FreeRTOS和USART DMA发送数据时,如果失一些数据,这可能是由于以下几个原因: 1.代码问题:可能存在一些代码问题,例如在发送调用之前或之后未正确初始化USARTDMA寄存器。 2.数据速率问题:数据传输的速率可能超出了USARTDMA的处理速率,导致一些数据未能及时传输。 3.数据传输过程中出现了中断:在数据传输过程中,如果发生过多的中断或错误中断,可能会导致数据失、传输失败等问题。 4.检查DMA缓冲区:在DMA缓冲区中可能存在数据未被正确清除的情况,导致数据失。 因此,为了避免数据失问题,需要仔细检查代码、数据传输速率、中断处理以及DMA缓冲区等方面,以确保数据能够正常传输。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值