一般我们发送一个字符的话就是使用下面这个函数。
比如:
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;
其实呢,本人觉得:放置检查发送结束的最好的位置应该是在你写的发送字符串的函数中添加这两行,普通发一个字符串应该不会那么快一个接一个,后面肯定还有语句,这些语句就充当延迟函数的作用。
一般我们发送一个字符的话就是使用下面这个函数。
比如:
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;
其实呢,本人觉得:放置检查发送结束的最好的位置应该是在你写的发送字符串的函数中添加这两行,普通发一个字符串应该不会那么快一个接一个,后面肯定还有语句,这些语句就充当延迟函数的作用。
举报