解决STM32F407串口连续发数据乱码、扰码问题

一般我们发送一个字符的话就是使用下面这个函数。解决STM32F407串口连续发数据乱码、扰码问题

比如:

USART_SendData(USART1,'a');
USART_SendData(USART1,'b');
USART_SendData(USART1,'c');
USART_SendData(USART1,'d');

然而呢,大家应该发现了,如果直接这么用的话,接受到的数据会乱码。

然后,经过多次尝试的朋友可能发现:如果在中间加个延迟函数就没问题了。

原因在于:

1.假设我现在要发送字符'a',我是将'a'这个字符放入到了串口的移位寄存器中。

2.我立马要发送字符'b',这时候其实字符'a'还没有发送结束,字符'b'就又被放入移位寄存器中。

3.后面的数据是一样的,前面一个字符尚未发送完毕,后面字符就再次覆盖掉了移位寄存器。所以引起了乱码。

添加延时函数的确可以解决这种问题,但我教的方法是:要善于使用官方数据手册。如图:

解决STM32F407串口连续发数据乱码、扰码问题解决STM32F407串口连续发数据乱码、扰码问题

可以找到发送完成其实是有一个标志位的,也就是USART_SR寄存器中的TC位,所以,只需要判断这个位是否为1就可以检测到字符是否发送结束,每当发送结束了再发后一个字符就不会出现乱码了。

解决方法:

在官方库中添加这两行代码即可

while(USARTx->SR&0X00000040);
USARTx->SR &= 0XFFFFFFBF;

解决STM32F407串口连续发数据乱码、扰码问题

其实呢,本人觉得:最好的位置应该是在你写的发送字符串的函数中添加这两行。