STM32使用串口发送数据 最后面会缺少一个回车的问题

写在前面:

/*
0x0D                     指的是“回车”   \r是把光标置于本行行首
0x0A                      指的是“换行”   \n是把光标置于下一行的同一列
0x0D + 0x0A         回车换行       \r\n把光标置于下一行行首
*/

使用的正点原子例程

if(dma_t==KEY0_PRES)//KEY0按下
{
    LCD_ShowString(20,60,200,16,16,"Start Transimit....");
    LCD_ShowString(20,80,200,16,16,"   %");//显示百分号

    printf("\r\nDMA DATA:\r\n\r\n");
    USART_DMACmd(USART1,USART_DMAReq_Tx,ENABLE);
			
    MYDMA_Enable(DMA1_Channel4);//开始一次DMA传输!	  
    //等待DMA传输完成,此时我们来做另外一些事,点灯
    //实际应用中,传输数据期间,可以执行另外的任务
    while(1)
    {
        if(DMA_GetFlagStatus(DMA1_FLAG_TC4)!=RESET)//等待通道4传输完成
        {
            DMA_ClearFlag(DMA1_FLAG_TC4);//清除通道4传输完成标志
            break; 
        }
        dma_pro=DMA_GetCurrDataCounter(DMA1_Channel4);//得到当前还剩余多少个数据
        dma_pro=(1)-((dma_pro)/((TEXT_LENTH+2)*10));//得到百分比
        dma_pro*=100;      //扩大100倍
        LCD_ShowNum(20,80,dma_pro,3,16);
    }			    
    LCD_ShowNum(20,80,100,3,16);//显示100%
    LCD_ShowString(20,60,200,16,16,"Transimit Finished!");//提示传送完成
}

printf("\r\nDMA DATA:\r\n\r\n");这一句,应该是回车换行 DMA DATA: 回车换行回车换行,但是在 发送第一次DMA DATA:之后,就少了一个回车换行

SendBuff[(TEXT_LENTH+2)*10],(TEXT_LENTH+2)*10:  140


DMA DATA:

Hello World!
Hello World!
Hello World!
Hello World!
Hello World!
Hello World!
Hello World!
Hello World!
Hello World!
Hello World!

DMA DATA:
Hello World!
Hello World!
Hello World!
Hello World!
Hello World!
Hello World!
Hello World!
Hello World!
Hello World!
Hello World!

DMA DATA:
Hello World!
Hello World!
Hello World!
Hello World!
Hello World!
Hello World!
Hello World!
Hello World!
Hello World!
Hello World!

在串口调试助手中,看十六进制,0D 0A 0D 0A会变成0D 0A 0D   最后一个0A接收不到

所以添加等待发送结束这一句话

while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET){};

全部代码为

if(dma_t==KEY0_PRES)//KEY0按下
{
    LCD_ShowString(20,60,200,16,16,"Start Transimit....");
    LCD_ShowString(20,80,200,16,16,"   %");//显示百分号
    
    printf("\r\nDMA DATA:\r\n\r\n");
    while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET)
    {
        ;
        /*
            等待发送结束
            没有这个while循环
            printf后面两个\r\n\r\n
            会变成\r\n\r
            0D 0A 0D 0A会变成
            0D 0A 0D   最后一个0A接收不到
            就会少一个换行
            
            0D “回车” \r
            0A “换行“ \n
        */
    }

    USART_DMACmd(USART1,USART_DMAReq_Tx,ENABLE);
    
    MYDMA_Enable(DMA1_Channel4);//开始一次DMA传输!	  
    //等待DMA传输完成,此时我们来做另外一些事,点灯
    //实际应用中,传输数据期间,可以执行另外的任务
    while(1)
    {
        if(DMA_GetFlagStatus(DMA1_FLAG_TC4)!=RESET)//等待通道4传输完成
        {
            DMA_ClearFlag(DMA1_FLAG_TC4);//清除通道4传输完成标志
            break; 
        }
        dma_pro=DMA_GetCurrDataCounter(DMA1_Channel4);//得到当前还剩余多少个数据
        dma_pro=(1)-((dma_pro)/((TEXT_LENTH+2)*10));//得到百分比
        dma_pro*=100;      //扩大100倍
        LCD_ShowNum(20,80,dma_pro,3,16);
    }			    
    LCD_ShowNum(20,80,100,3,16);//显示100%
    LCD_ShowString(20,60,200,16,16,"Transimit Finished!");//提示传送完成
}

这样就不会出现少回车换行的问题了

SendBuff[(TEXT_LENTH+2)*10],(TEXT_LENTH+2)*10:  140


DMA DATA:

Hello World!
Hello World!
Hello World!
Hello World!
Hello World!
Hello World!
Hello World!
Hello World!
Hello World!
Hello World!

DMA DATA:

Hello World!
Hello World!
Hello World!
Hello World!
Hello World!
Hello World!
Hello World!
Hello World!
Hello World!
Hello World!

DMA DATA:

Hello World!
Hello World!
Hello World!
Hello World!
Hello World!
Hello World!
Hello World!
Hello World!
Hello World!
Hello World!

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值