一般我们发送一个字符的话就是使用下面这个函数。
比如:
USART_SendData(USART1,'a');
USART_SendData(USART1,'b');
USART_SendData(USART1,'c');
USART_SendData(USART1,'d');
然而呢,大家应该发现了,如果直接这么用的话,接受到的数据会乱码。
然后,经过多次尝试的朋友可能发现:如果在中间加个延迟函数就没问题了。
原因在于:
1.假设我现在要发送字符'a',我是将'a'这个字符放入到了串口的移位寄存器中。
2.我立马要发送字符'b',这时候其实字符'a'还没有发送结束,字符'b'就又被放入移位寄存器中。
3.后面的数据是一样的,前面一个字符尚未发送完毕,后面字符就再次覆盖掉了移位寄存器。所以引起了乱码。
添加延时函数的确可以解决这种问题,但我教的方法是:要善于使用官方数据手册。如图:
可以找到发送完成其实是有一个标志位的,也就是USART_SR寄存器中的TC位,所以,只需要判断这个位是否为1就可以检测到字符是否发送结束,每当发送结束了再发后一个字符就不会出现乱码了。
解决方法:
在官方库中添加这两行代码即可
while(USARTx->SR&0X00000040);
USARTx->SR &= 0XFFFFFFBF;
其实呢,本人觉得:最好的位置应该是在你写的发送字符串的函数中添加这两行。