初级会员

- 积分
- 72
- 金钱
- 72
- 注册时间
- 2018-4-20
- 在线时间
- 8 小时
|

楼主 |
发表于 2019-5-26 17:57:18
|
显示全部楼层
个人认为,您之前的代码,如下所示:
for(t=0;t<len;t++)
{
while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);//等待发送结束
USART_SendData(USART1, USART_RX_BUF[t]);//向串口1发送数据
}
也是不可取的。
因为我们等待发送结束,一定要放在发送函数的后面,否则,失去它的意义了。
至于为什么你的代码也能调试成功,是因为for循环结束后没有继续调用发送函数了。
试想一下如果继续调用发送函数,那么for循环里发送的最后一个字节,就会被吃掉。
所以代码还是要写成这样,如下所示:
for(t=0;t<len;t++)
{
USART_SendData(USART1, USART_RX_BUF[t]);//向串口1发送数据
while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);//等待发送结束
}
但是这样写,之前的问题又来了,printf函数里的最后一个字节会被吃掉。其实被吃掉的原因是,TDR里的数据还没有移送到移位寄存器,就有下一个字节的数据被写入到TDR。那么为了防止这种事情发生,咱们前面再加一条语句,判断TDR是否为空。前后双保险,万无一失了吧,这回,哈哈 ,正确代码如下:
for(t=0;t<len;t++)
{
while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)!=SET);//等待TDR为空
USART_SendData(USART1, USART_RX_BUF[t]);//向串口1发送数据
while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);//等待发送结束
} |
|