[HAL库]STM32之DMA方式串口发送

目的:使用cube软件实现DMA方式的数据发送和接收

1.在cube Pinout中打开USART1,方式为异步通讯(Asynchronous);

2.在cube Configuration中打开USART1 Configuration,添加DMA通道(接收改为循环方式)以及打开usart的全局中断,在NVIC中调整优先级

3.生成代码,在keil中进行以下修改:
1)在main文件中建立发送缓存区和接收缓存区(两个定常数组)

使用HAL_UART_Receive_DMA(&huart1,aRxBuffer,sizeof(aRxBuffer)) 进行DMA的接收(等待接收)

使用HAL_UART_Transmit_DMA(&huart1,aTxBuffer,sizeof(aTxBuffer)); 进行DMA的发送(立即发送)

2)在usart文件中书写HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)函数的逻辑

该函数在DMA接收到期待接收长度的数据时触发中断进入

 

存留问题:

(1)DMA只有在接收到期待长度的数据时才触发中断,所以上位机发送数据时最好是补全至定长后发送;

(2)如果DMA的期待长度为1时,一次性发送不定长数据时会导致接收一个丢失下一个的情况,例如发送123456会接收到135,可能是DMA发送时无法及时接收接下来的数据。

解决办法:

1.改为中断接收

2.补全成定长的数据包后一个包一个包发送可以避免字符丢失

3.采用空闲中断的方式 即使数据长度没有达到期望,只要一段时间未接收到数据即进入中断

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值