持续关注阿杰在线更新保姆式笔记~~坚持日更
目录
USART-FLAG-TXE与USART-FLAG-TC标志位
一、实验内容梳理
首先结合串口调试助手对实验进行说明,以便后续结合代码熟悉整个流程。整个实验其实就是通过串口调试助手向单片机发送数据,然后单片机将接收到的数据返回给上位机并加以显示。
简单来串口调试助手说其实就是用于上位机和下位机通信用的一个桥梁软件,功能主要有两个这也是本实验的两个步骤:
- 人工发送数据给单片机处理,即通过串口调试助手的下方窗口编辑数据,然后点击发送按钮,就能发送数据给单片机;
- 接受单片机发送的数据显示给你看,即通过串口调试助手上方窗口,将单片机发回给上位机的数据进行显示;
关于串口调试助手,还应知道:
- 发送英文字符需要用一个字符即8位,发送汉字需要两个字符即16位,如上图,发送汉字“宋”实际是发送“CB(1100 1011)CE(1100 1110)”而发送英文字符S实际是发送“53(0101 0011)”,本质上没有太大区别;
- 勾选了下方“发送新行”后,XCOM就会再你输入的需要发送的数据后自动加上一个回车(0X0D+0X0A),如果不勾选则我们在手动输入完“宋S”后还需敲一个回车键只有这样点击发送后,调试助手上方窗体才能将其显示,这是因为我们在程序的串口中断中自定义了一个数据接收协议,即只有当接受的数据以回车结尾(0X0D+0X0A),串口才认可数据接受完毕。
二、对于串口中断函数(自定义数据接收协议)的理解
正点原子的例程中通过语句USART_ITConfig(USART1, USART_IT_RXNE, ENABLE)开启相关中断,当读数据寄存器非空,即单片机一接收到数据时,便会触发串口1的中断函数。
改协议的核心是定义了一个16位的变量USART_RX_STA,该变量的0-13位用于存储接收到的数据,最后的14、15两位作用在于,当14、15位依次接收到0x0d和0x0a时,依次将这两位置1,作为判断数据是否接收完的标志位。
以下是我看到的一个注释比较详细的代码,和一个实例,结合两者就可以很好的理解这个过程和代码,
.h文件
#define USART_REC_LEN 200 //定义最大接收字节数 200
#define EN_USART1_RX 1 //使能(1)/禁止(0)串口1接收
extern u8 USART_RX_BUF[USART_REC_LEN];
//接收缓冲,最大USART_REC_LEN个字节.末字节为换行符
extern u16 USART_RX_STA; //接收状态标记
void USART1_IRQHandler(void) //串口1中断服务程序
{
u8 Res; //定义unsigned char型字符Res
if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
//接收中断(接收到的数据必须是0x0d 0x0a结尾)
//这里判断发送接收完成的依据就是串口数据0x0d 0x0a,
//0x0d是CR(carriage return)回车的意思,光标回到最左边,
//0x0a是LF(line feed)换行的意思,光标到达下一行,
//但是在PC上回车和换行是在一起的就是按下回车按键
//当然可以更改程序使用其他进行判断例如使用0x2a也就是*进行结束判断
{
Res =USART_ReceiveData(USART1);//(USART1->DR);
//读取接收到的数据,存放到变量Res中
if((USART_RX_STA&0x8000)==0)
//判断接收是否未完成
//接收完成未清除标志位,还是会不断进入到接收中断,所以使用标志进行判断,
//当接收完成便不会跳入到判断,从而不执行任何指令,空等待
//使用条件判断是否已经接收完数据,这里判断接收完的依据就是收到了0x0a;
//具体判断在后面