【STM32】RS485通信使用DMA串口发送数据出现数据丢失、断包问题排查方法

最近在搞这个Modbus协议,由于485协议是半双工的,区别于RS 232的全双工,考虑不周导致调试modbus协议时候出了不少问题。

第一,大多数开发板上的485芯片是MAX485,发送和接收状态的切换是通过IO给到这个两个引脚不同的电平进行切换,由于你的软件程序跑的太快了,写程序给485芯片进行接收或发送时切换注意加点延时等待一下。

/*加短暂延时,保证MAX485芯片转发数据完毕*/
Delay(0xFFFF);
//	使能接收数据
RS485_RX_EN()	;

第二,485数据使用DMA串口发送出现数据丢失的话。

1.排查DMA传输的BUFF不要是栈空间的临时变量BUFF,要使用全局的定义BUFF,否则很容易出现生命周期问题,DMA还没传输完成,内存就给回收了。

2.注意是不是DMA还没传输完成,就把485芯片的发送状态切换成了接收状态,实测DMA传输完BUFF的数据相对还是比较慢的,尤其数据量大的时候。同样485芯片进行接收或发送时切换时注意等待DMA传输完成在进行切换,此处可以利用DMA中断完成。

 //等待DMA传输完成,否则数据较长的话丢数据
while(uart2_dma_tx_complete != 1){};
uart2_dma_tx_complete=0;
  • 6
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值