找回密码
 立即注册
查看: 194|回复: 6

串口2使用DMA收发数据一直追加的问题,求解决方案 |已解决

[复制链接]
  • 打卡等级:偶尔看看I
  • 打卡总天数:13
  • 最近打卡:2025-05-01 11:26:42
已绑定手机

9

主题

14

回帖

168

积分

注册会员

积分
168
发表于 2025-4-14 15:21:02 | 显示全部楼层 |阅读模式

image.png
upload 附件:uart_dma.zip

void main(void)
{
	u16 Rx_Count=256;
    u16 volatile index1=0,index2=0;
    SYS_Init();

    while (1)
    {
        if(UartRxflAG)
        {
            UartRxflAG=0;
            index2=DMA_UART2_ReadRxDone();//记录当前的读取字节数量
            printf("index2 = %d\n",index2);
            //下面两条代码必须注释掉一个,我的目的是使用index2-index1记录两
            //次数据接收之间DMA_UR2R_DONE这个寄存器
            //的差值,用来输出。
            // strncpy(pu8UR2DMATxBuffer,pu8UR2DMARxBuffer,index2-index1);//这里有问题,index2-index1=0;
            strncpy(pu8UR2DMATxBuffer,pu8UR2DMARxBuffer,Rx_Count); // 这个可以跑通,但是数据会一直追加
  
            index1=index2;   
            printf("index1 = %d\n",index1);//记录上一次的读取值
            DMA_UART2_TriggleTx();
        }

    }
}

index2和index1应该是不一样的,但是输出是一样的。求大佬解惑,工程已经放在附件里面了。

回复

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:162
  • 最近打卡:2025-05-01 06:56:44
已绑定手机

56

主题

1319

回帖

2938

积分

荣誉版主

无情的代码机器

积分
2938
发表于 2025-4-14 15:26:33 | 显示全部楼层
index1如果是记录上一个值,是不是应该先打印再赋值
截图202504141526092984.jpg
三天不学习,赶不上刘少奇~
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:162
  • 最近打卡:2025-05-01 06:56:44
已绑定手机

56

主题

1319

回帖

2938

积分

荣誉版主

无情的代码机器

积分
2938
发表于 2025-4-14 15:38:55 | 显示全部楼层
一直追加的问题的问题是由于在UART2_ISR中断里处理数据,而不是DMA_UART2RX_ISR中断。DMA还没收够接收总字节数
截图202504141538538490.jpg
三天不学习,赶不上刘少奇~
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:13
  • 最近打卡:2025-05-01 11:26:42
已绑定手机

9

主题

14

回帖

168

积分

注册会员

积分
168
发表于 2025-4-14 15:45:05 | 显示全部楼层
[quote][size=2][url=forum.php?mod=redirect&goto=findpost&pid=158828&ptid=16989][color=#999999]ercircle 发表于 2025-4-14 15:26[/color][/url][/size] index1如果是记录上一个值,是不是应该先打印再赋值[/quote]

image.png

UartRxflAG=0;
         
                index2=DMA_UART2_ReadRxDone();//记录当前的读取字节数量
                printf("index2 = %d\n",index2);
              
              
          
            //下面两条代码必须注释掉一个,我的目的是使用index2-index1记录两
            //次数据接收之间DMA_UR2R_DONE这个寄存器
            //的差值,用来输出。
            // strncpy(pu8UR2DMATxBuffer,pu8UR2DMARxBuffer,index2-index1);//这里有问题,index2-index1=0;
            strncpy(pu8UR2DMATxBuffer,pu8UR2DMARxBuffer,Rx_Count); // 这个可以跑通,但是数据会一直追加
            printf("index1 = %d\n",index1);//记录上一次的读取值
            index1=index2;   

点评

累加问题看楼上  详情 回复 发表于 2025-4-14 15:51
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:162
  • 最近打卡:2025-05-01 06:56:44
已绑定手机

56

主题

1319

回帖

2938

积分

荣誉版主

无情的代码机器

积分
2938
发表于 2025-4-14 15:51:54 | 显示全部楼层
小*** 发表于 2025-4-14 15:45
UartRxflAG=0;
         
                index2=DMA_UART2_ReadRxDone();//记录当前的读取字节数量

累加问题看楼上
三天不学习,赶不上刘少奇~
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:13
  • 最近打卡:2025-05-01 11:26:42
已绑定手机

9

主题

14

回帖

168

积分

注册会员

积分
168
发表于 2025-4-14 16:58:21 | 显示全部楼层
erci*** 发表于 2025-4-14 15:51
累加问题看楼上

感谢大佬解惑,成功解决
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:13
  • 最近打卡:2025-05-01 11:26:42
已绑定手机

9

主题

14

回帖

168

积分

注册会员

积分
168
发表于 2025-4-15 23:29:12 | 显示全部楼层
已解决,应该使用DMA中断来处理串口接收到的数据。以下是更改后的代码

uart_dma.zip

39.14 KB, 下载次数: 3

回复 支持 反对

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-5-1 19:54 , Processed in 0.139713 second(s), 90 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表