使用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);
}