问题原因

  • 纯纯在调试陀螺仪(GY25)的时候出现了发送数据不给响应的问题,连接串口发现出现了首个字符打印不出来的情况,让纯纯特别困惑。
  • 源代码是这样写的(抄了网上先辈的代码)
1
2
3
4
5
6
7
/**********************printf重定向****************************/
int fputc(int ch, FILE *f)
{
USART_SendData(USART2, ch); //发送数据
while (USART_GetFlagStatus(USART2, USART_FLAG_TC) == RESET);//等待发送完成
return ch;
}
  • 之前用这段代码的时候没有发现过问题,主要文件中有多处收发的代码,不大关注第一句的完整性,而这一次由于作为协议开头发送,丢掉了一个数据头说明这是一个普适的问题而不是偶尔的发生的错误。

查找办法

  • 没有对策,芯片手册,还是翻看了stm32的芯片手册,看到如下内容
  • 可以看到判断这一个标志位清空了就可以认定为发送完成了
  • TC 和 TXE 标志位在复位的时候被置1
  • 问题出现了,发送第一个数据的时候没有进行while判断,也就是无法判断发送完成直接进到下一个发送
  • 这样导致了首次第一个字符还没有被输出,就被后面的字符覆盖掉了。

解决

  • 多加一句USART2 -> SR ;
1
2
3
4
5
6
7
8
/**********************printf重定向****************************/
int fputc(int ch, FILE *f)
{
USART2 -> SR ;
USART_SendData(USART2, ch); //发送数据
while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);//等待发送完成
return ch;
}