完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
最近在使用F334的USART+DMA进行发送数据的时候,遇到了一个很奇怪的问题。
在调用HAL_UART_Transmit_DMA(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)发送数据时,实际发送的数据长度总比我设置的Size少两个。 比如配置成HAL_UART_Transmit_DMA( huart3, pucData, 19), 然后在DMA的发送完成中断里观察寄存器,发现串口的发送长度和发送计数器两个值,都是19,应该是对的。DMA配置的是normal模式,通讯的参数是9600bps, 8个数据位, 无校验位 , 1个停止位。 但是,从串口实际发送出来的数据,其实只有17个数。 如果我需要发送19个Byte,我在调用DMA发送的时候,需要将发送数据长度配置为21,即HAL_UART_Transmit_DMA( huart3, pucData, 21) 这个时候,串口发送出来的就是完整的19个Byte了。 我实际是用在485通讯上,所以有一个GPIO用于控制数据流。 这个GPIO,在DMA发送完成中断程序的最开始我打断点看过IO口的电平,依然是在发送状态,随后,我才将IO后电平反转至接收状态。 除此之外,发现DMA的中断函数里,normal模式下会使能串口的发送完成中断TCIE,我如果在串口的发送完成中断里反转485的流控制IO,就可以完整的发送我需要发送的数据长度,不用再加2个byte的长度。 感觉好奇怪啊,难道是DMA的传输完成中断时,数据只是从DMA移到了串口的发送的寄存器,但是实际还没发出去吗? 如果是这个逻辑,在DMA的传输完成中断里,将流控制的IO反转,确实会打断数据的发送。 各位兄弟姐妹,大佬大神,走过路过帮忙支支招,看大家有没有遇到类似的问题呢。 |
|
相关推荐
2个回答
|
|
应该在串口发送完成中断里再反转流控制的IO
DMA中断时,只表示需要传送的所有数据字节全部传送到串口的发送数据寄存器中了。 此时串口实际上还有2个字节并未发送完成,数据寄存器和移位寄存器中的2个字节还需要发送,并不能关闭串口发送。 同理,如果是485切换方向,必须要等到发送完成,也就是移位寄存器发送完成-TC标志置位。 |
|
|
|
有可能是由于USART发送数据时,发送完最后一个字节后,需要一定的时间才能将该字节完全发送出去,导致你观察到的实际发送的数据长度比设置的Size少两个字节。
解决这个问题的方法是,在调用HAL_UART_Transmit_DMA函数前,先等待一段时间,确保USART已经完全发送了所有数据,然后再执行其它操作。 具体的实现可以使用HAL_Delay函数来等待一段时间,例如可以延时10ms,确保USART发送完所有数据: ```cpp HAL_UART_Transmit_DMA(&huart3, pucData, 19); HAL_Delay(10); ``` 或者可以使用HAL_UART_GetState函数来查询USART的状态,当USART处于空闲状态时,说明数据已经发送完毕,可以继续执行其它操作: ```cpp HAL_UART_Transmit_DMA(&huart3, pucData, 19); while(HAL_UART_GetState(&huart3) != HAL_UART_STATE_READY); ``` 通过以上方法,可以确保USART已经完全发送了所有数据,避免了观察到的实际发送的数据长度比设置的Size少两个字节的问题。 |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1810 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1631 浏览 1 评论
1098 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
737 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1687 浏览 2 评论
1947浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
751浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
584浏览 3评论
604浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
568浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-29 16:33 , Processed in 0.954998 second(s), Total 46, Slave 40 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号