STM32串口通信使用及调试备忘

使用STM32这么久了,串口还是比较少使用到,这次因为做项目,真正用上了串口通信,也遇到了一些问题,因此随手写篇Blog记录一下,以作分享和备忘:

1.串口发送数据,首字符丢失:

配置完串口,后部分代码如下:

#define LENOFDATA 8
u8 dataToSend[LENOFDATA]  =  "100";

......

        for(cnt=0; cnt<LENOFDATA; cnt++)
        {               
            USART_SendData(USART1, dataToSend_X[cnt]);
            while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);
        }

 

上位机接收到的数据如下:

很明显有一次丢失了首字符,后来在论坛上得知,

单片机复位上电后,USART_FLAG_TC会被默认置为1,因此while中的条件便不成立了,这样一来可能第一个字符还未发送完成,for循环便开始了第二次循环。

解决方法:

   for(cnt=0; cnt<LENOFDATA; cnt++)
        {           

            USART1->SR;

            USART_SendData(USART1, dataToSend_X[cnt]);
            while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);
        }

            USART1->SR就是读取状态寄存器,将USART_FLAG_TC置零。

Note: 如果仅发送一个数据,可不读取,没有第二个字符,因此不会存在字符覆盖的情况。

2.关于库函数的理解注释:

void USART_SendData(USART_TypeDef* USARTx, uint16_t Data)
{
  /* Check the parameters */
  assert_param(IS_USART_ALL_PERIPH(USARTx));
  assert_param(IS_USART_DATA(Data)); 

  /* Transmit Data */
  USARTx->DR = (Data & (uint16_t)0x01FF);
}

猜你喜欢

转载自blog.csdn.net/yhf2333/article/details/81453037