关于RS485通讯中使用STM32串口以DMA方式发送数据丢失字节的问题

本文探讨了在STM32F1xx使用DMA进行RS485通信时数据字节丢失的问题,分析了发送过程中的时序问题,并提供了两种解决方案:在数据末尾添加停止位后丢弃或利用USART3发送完成中断避免DMA中断。
摘要由CSDN通过智能技术生成

问题描述

在测试用STM32F1xx芯片的串口USART3以DMA方式进行RS485收发通讯时,出现数据字节丢失的现象,一般丢失1~2个字节。

原因分析

在单步调试中,收到的数据就是正常的,由此想到是时序出现了问题。为了解释一下为什么会出现这样的情况,接下来就讲一下DMA串口发送的实际过程
这片文章中提到了,串口发送数据过程。
在这里插入图片描述
①将要发送的数据写入发送缓冲寄存器
②发送缓冲寄存器将数据一位一位地移入发送移位寄存器,注意!若全部移入,即此时发送缓冲寄存器没有数据,全部进入发送移位寄存器,这个时候将由硬件产生发送中断标志位UCTXIFG,表明此时发送缓冲寄存器为空,可以接收另一个数据。
③移位寄存器将数据一位一位地发送到我们要接收数据的接口处,需要一定的时间T。
何时转换485的方向成了问题?
参考这篇文章,对DMA时序进行了分析。
在这里插入图片描述
需要让数据字节不丢失的话,必须让所有字节(包括字节的停止位)在TX线上稳定发送完成后,才能将RS485切换为接收模式。

解决方案

方法一:

数据传输时末尾,添加2个字节,接收处理时将末尾FF 丢掉。

方法二:

用USART3发送完成中断,不用DMA发送完成中断。在USART3中断服务程序USART3_IRQHandler()中,将RS485切换为接收模式。
如下所示

void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)
{
    if(huart == &huart3)
    {
    	RS485DIR_RX // 切换为 RS485 接收模式
    }
}

希望可以帮助到遇到同样问题的朋友,共同进步!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

S安东尼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值