IAP_4_串口通讯准备

1、开始通讯

会配置一下STM32的发送接收并不代表会通讯了,这其中会有一些细节的问题,只有真正去做,才能更加深入。

2、多一个0xFF

2.1 、发现问题

STM32上电会多一个数据,0xFF,用电脑的串口助手调试的时候是没有的哦,所以我用串口助手看没问题,直接上来就开始用单片机接收了,结果不对,把接收到的数据打印出来一看,前面多了一个0xFF。

2.2、Bug来源

配置串口初始化的时候,打开发送模式,TE(发送使能)位置1.

下面的三句话来自手册,连起来看。

在这里插入图片描述

2.3、思路

直接把0xFF去掉,并不是一个好的解决方式,况且这个开发板上电的时候会多次复位,应该在接收之前先进行一次通讯,做为开始传输的标志。

思路:

  1. STM32_TX发送0x56,做为开始传输的标志。
  2. STM32_RX接收到0x56,做为开始接收的标志,并舍弃第一个数据0x56。
  3. 然后再开始传输。

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); 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值