问题描述

在测试用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 接收模式
    }
}

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

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐