问题描述
在测试用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 接收模式
}
}
希望可以帮助到遇到同样问题的朋友,共同进步!