小垃圾 发表于 2025-4-14 15:21:02

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

<p><img src="data/attachment/forum/202504/14/151759tzk1ohwc1ke14gp1.png" alt="image.png" title="image.png" /><br />
<a href="forum.php?mod=attachment&amp;aid=93127" title="attachment"><img src="/source/plugin/zhanmishu_markdown/template/editor/images/upload.svg" alt="upload" /> 附件:uart_dma.zip</a></p>
<pre><code class="language-c">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(&quot;index2 = %d\n&quot;,index2);
            //下面两条代码必须注释掉一个,我的目的是使用index2-index1记录两
            //次数据接收之间DMA_UR2R_DONE这个寄存器
            //的差值,用来输出。
            // strncpy(pu8UR2DMATxBuffer,pu8UR2DMARxBuffer,index2-index1);//这里有问题,index2-index1=0;
            strncpy(pu8UR2DMATxBuffer,pu8UR2DMARxBuffer,Rx_Count); // 这个可以跑通,但是数据会一直追加

            index1=index2;   
            printf(&quot;index1 = %d\n&quot;,index1);//记录上一次的读取值
            DMA_UART2_TriggleTx();
      }

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

ercircle 发表于 2025-4-14 15:26:33

index1如果是记录上一个值,是不是应该先打印再赋值

ercircle 发表于 2025-4-14 15:38:55

一直追加的问题的问题是由于在UART2_ISR中断里处理数据,而不是DMA_UART2RX_ISR中断。DMA还没收够接收总字节数

小垃圾 发表于 2025-4-14 15:45:05

ercircle 发表于 2025-4-14 15:26
index1如果是记录上一个值,是不是应该先打印再赋值

<p><img src="data/attachment/forum/202504/14/154443tm7p76frphzthfv4.png" alt="image.png" title="image.png" /></p>
<pre><code>UartRxflAG=0;
         
                index2=DMA_UART2_ReadRxDone();//记录当前的读取字节数量
                printf(&quot;index2 = %d\n&quot;,index2);
            
            
         
            //下面两条代码必须注释掉一个,我的目的是使用index2-index1记录两
            //次数据接收之间DMA_UR2R_DONE这个寄存器
            //的差值,用来输出。
            // strncpy(pu8UR2DMATxBuffer,pu8UR2DMARxBuffer,index2-index1);//这里有问题,index2-index1=0;
            strncpy(pu8UR2DMATxBuffer,pu8UR2DMARxBuffer,Rx_Count); // 这个可以跑通,但是数据会一直追加
            printf(&quot;index1 = %d\n&quot;,index1);//记录上一次的读取值
            index1=index2;   
</code></pre>

ercircle 发表于 2025-4-14 15:51:54

小垃圾 发表于 2025-4-14 15:45
UartRxflAG=0;
         
                index2=DMA_UART2_ReadRxDone();//记录当前的读取字节数量


累加问题看楼上

小垃圾 发表于 2025-4-14 16:58:21

ercircle 发表于 2025-4-14 15:51
累加问题看楼上

感谢大佬解惑,成功解决

小垃圾 发表于 2025-4-15 23:29:12

已解决,应该使用DMA中断来处理串口接收到的数据。以下是更改后的代码
页: [1]
查看完整版本: 串口2使用DMA收发数据一直追加的问题,求解决方案 |已解决