串口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&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("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();
}
}
}
</code></pre>
<h1>index2和index1应该是不一样的,但是输出是一样的。求大佬解惑,工程已经放在附件里面了。</h1>
index1如果是记录上一个值,是不是应该先打印再赋值
一直追加的问题的问题是由于在UART2_ISR中断里处理数据,而不是DMA_UART2RX_ISR中断。DMA还没收够接收总字节数
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("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;
</code></pre>
小垃圾 发表于 2025-4-14 15:45
UartRxflAG=0;
index2=DMA_UART2_ReadRxDone();//记录当前的读取字节数量
累加问题看楼上 ercircle 发表于 2025-4-14 15:51
累加问题看楼上
感谢大佬解惑,成功解决 已解决,应该使用DMA中断来处理串口接收到的数据。以下是更改后的代码
页:
[1]