发新帖本帖赏金 66.00元(功能说明)我要提问
返回列表
打印
[STM32F1]

DMA串口发送问题

[复制链接]
1631|12
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
liuoulyy|  楼主 | 2017-9-30 16:25 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
用DMA串口发送数据,在发送完成下清RS422使能引脚(发送完禁止发送,允许接收).但是DMA发送完,实际是数据并没发送完,RS422引脚就清0了.所以发送不了.不知大侠是怎样处理的?
void DMA1_Channel4_IRQHandler(void)
{       
               
                if(DMA_GetFlagStatus(DMA1_FLAG_TC4)==SET)
                {  
                                DMA_ClearFlag(DMA1_FLAG_TC4);
                                GPIO_ResetBits(GPIOB,GPIO_LED2);        //清0         
                                DMA_Cmd(DMA1_Channel4,DISABLE);
                                OSSemPost(Uart1_Tx_E);
     
                }
}
沙发
pegion1001| | 2017-9-30 17:13 | 只看该作者
我是判断huart->gState = HAL_UART_STATE_BUSY_TX;这个

使用特权

评论回复
板凳
mmuuss586| | 2017-9-30 18:33 | 只看该作者
先延时一段时间看看;485芯片有延迟;

使用特权

评论回复
地板
山东电子小菜鸟| | 2017-10-1 14:41 | 只看该作者
恩 有延时的

使用特权

评论回复
5
598330983| | 2017-10-1 22:51 | 只看该作者
应该有判断是否发送完的标志位

使用特权

评论回复
6
feelhyq| | 2017-10-2 22:26 | 只看该作者
本帖最后由 feelhyq 于 2017-10-2 22:40 编辑

void DMA1_Channel4_IRQHandler(void)
{        
        unsigned char u8Flag = 0;                 /* 新增代码 */
        if(DMA_GetFlagStatus(DMA1_FLAG_TC4)==SET)
        {  
               DMA_ClearFlag(DMA1_FLAG_TC4);
               u8Flag  = USART_GetFlagStatus(USART1, USART_FLAG_TC); /* 新增代码,判断串口是不是全部发送完成了 */
               while(1 != u8Flag  ); /* 新增代码,如果没有完成则等在这里 */                                                                                                                                                           USART_ClearFlag(USART1, USART_FLAG_TC); /* 新增代码,清除发送完成标志位 */              
               GPIO_ResetBits(GPIOB,GPIO_LED2);        //清0         
               DMA_Cmd(DMA1_Channel4,DISABLE);
               OSSemPost(Uart1_Tx_E);
   
       }
}

需要判断一下传输是否完成,原因如下:

if(DMA_GetFlagStatus(DMA1_FLAG_TC4)==SET)这个判断的作用是DMA搬运完成了,
但是此时最后一个字节数据此时因为DMA搬运完成,搬运到数据寄存器里面去了,数据寄存器
里面的数据并没有完全发送出去,因为串口发送的数据还要通过硬件的移位寄存器(对用户不可见)
一位一位的通过Tx管脚发送出去,这个发送需要一定的时间。

你加了这一句判断if(DMA_GetFlagStatus(DMA1_FLAG_TC4)==SET)后,是无法判断数据有没有完成的,他只是判断DMA数据搬运完成,而不是串口数据发送完成,很可能数据还在移位寄存器里面,正在传输。









使用特权

评论回复

打赏榜单

liuoulyy 打赏了 66.00 元 2017-10-20
理由:方案完全正确

7
dingbo95| | 2017-10-3 08:51 | 只看该作者
延迟问题,485需要延时一会。

使用特权

评论回复
8
yiy| | 2017-10-3 22:13 | 只看该作者
通常发送完会有个标志位可以检测。

使用特权

评论回复
9
yiy| | 2017-10-3 22:57 | 只看该作者
前面的朋友分析的很到位,没有弄对点

使用特权

评论回复
10
捉虫天师| | 2017-10-4 13:39 | 只看该作者
处处有高人啊,假期还在学习的人

使用特权

评论回复
11
zchong| | 2017-10-5 10:08 | 只看该作者
不要用DMA完成中断,用UART的TC标志

使用特权

评论回复
12
gejigeji521| | 2017-10-5 11:52 | 只看该作者
各位分析的都挺对的,没想到DMA发送这么多讲究。

使用特权

评论回复
13
yiy| | 2017-10-5 18:06 | 只看该作者
DMA用起来还是挺复杂的,需要认真仔细。

使用特权

评论回复
发新帖 本帖赏金 66.00元(功能说明)我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

134

主题

472

帖子

1

粉丝