1、开始通讯
会配置一下STM32的发送接收并不代表会通讯了,这其中会有一些细节的问题,只有真正去做,才能更加深入。
2、多一个0xFF
2.1 、发现问题
STM32上电会多一个数据,0xFF,用电脑的串口助手调试的时候是没有的哦,所以我用串口助手看没问题,直接上来就开始用单片机接收了,结果不对,把接收到的数据打印出来一看,前面多了一个0xFF。
2.2、Bug来源
配置串口初始化的时候,打开发送模式,TE(发送使能)位置1.
下面的三句话来自手册,连起来看。
2.3、思路
直接把0xFF去掉,并不是一个好的解决方式,况且这个开发板上电的时候会多次复位,应该在接收之前先进行一次通讯,做为开始传输的标志。
思路:
- STM32_TX发送0x56,做为开始传输的标志。
- STM32_RX接收到0x56,做为开始接收的标志,并舍弃第一个数据0x56。
- 然后再开始传输。
3、第一个字节丢失
按照上面的思路解决了0x00的问题,但是还是有Bug,第一个字节丢失了。
3.1、Bug来源
继续看手册,问题在状态寄存器,状态寄存器如下,高16位P掉了。
串口状态寄存器USART_SR上电默认0xC0,TXE和TC位均为1.
TXE位为1表示“数据已被转移到移位寄存器”;
TC位为1表示“发送完成”。
如果初始化后,直接执行:
USART_SendData(USART1,0x56);
while((USART1->SR&0X40)==0); //等待发送结束
执行USART_SendData(USART1,0x56);
0x56被放到USART_DR.
执行while((USART1->SR&0X40)==0);
但是由于上电默认TC=1这一句被直接跳过,并没有等待发送完成。
当下一次执行USART_SendData
,第二个字节被移到移位寄存器里,第一个字节的数据丢失。
由于while中读过SR,第二次USART_SendData中写过USART_DR,此时TC位已经清0了,第二次发送正常。
3.2、解决
在初始化后手动将TC位清0,以等待第一次数据发送完成。
USART_ClearFlag(USART1,USART_FLAG_TC);