串口通信(USART)程序代码解读

本文是针对串口通信(USART)的串口源文件(usart.c)中回调函数的代码解读,完整的串口源文件(usart.h)见文章《串口通信(USART)程序代码-CSDN博客

一、代码解读

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)函数体解读:

if(huart->Instance==USART1)

huart->Instance,用于访问结构体成员Instance;

huart->Instance==USART1,判断结构体成员Instance是否等于USART1;如果等于USART1,则条件为真,执行if内的代码,如果不等于USART1,则条件为假,跳过if内的代码。

if( (USART_RX_STA&0x8000)==0 )

 USART_RX_STA&0x8000,USART_RX_STA 按位与 0x8000(1000 0000 0000 0000),其结果要么是0要么是非0,取决于 USART_RX_STA 的最高位(第15位)是否为1;

(USART_RX_STA&0x8000)==0,判断二者按位与的结果是否等于0,即检查USART_RX_STA的最高位;如果二者按位与的结果为0,则说明USART_RX_STA的最高位为0,条件为真,继续执行if内的代码;如果二者按位与的结果为非0,则说明USART_RX_STA的最高位为1,条件为假,跳过if内的代码。

该语句用于检查USART_RX_STA的最高位(第15位)。

if(USART_RX_STA&0x4000)

USART_RX_STA&0x4000, 

USART_RX_STA按位与0x4000(0100 0000 0000 0000),直接将按位与的结果作为判断条件,如果按位与的结果为0,则条件为假,跳过if内的代码;如果按位与的结果为非0,则条件为真,执行if内的代码;

该语句用于检查USART_RX_STA的第14位。

#注意 :上一段代码的作用是检查USART_RX_STA的第15位,所以如果程序执行到这里,说明USART_RX_STA的第15为已经是0了。

 if(aRxBuffer[0]!=0x0a)USART_RX_STA=0;

 ①aRxBuffer[0] != 0x0a,检查aRxBuffer的第1个元素是否不等于0x0a(0000 0000 0000 1010),如果aRxBuffer的第1个元素不等于0x0a,则执行②。

②USART_RX_STA=0,将USART_RX_STA置零。

else USART_RX_STA|=0x8000;

 USART_RX_STA|=0x8000,将USART_RX_STA按位或0x8000(1000 0000 0000 0000),这个操作是将USART_RX_STA的第15位置1。

else  

if(aRxBuffer[0]==0x0d)USART_RX_STA|=0x4000;

①aRxBuffer[0]==0x0d,检查aRxBuffer的第一个元素是否为0x0d(0000 0000 0000 1101),

如果aRxBuffer的第一个元素等于0x0d,则执行②。

②USART_RX_STA|=0x4000,将USART_RX_STA的第14位置1。

else  

USART_RX_BUF[USART_RX_STA&0X3FFF]=aRxBuffer[0] ;

①USART_RX_STA&0X3FFF,USART_RX_STA按位与0X3FFF(0011111111111111),该操作将USART_RX_STA的高2位(第14位、第15位)清零,而保留低14位(第0位到第13位),高2位用于标记接收完成或其他状态信息,低14位用于记录已经接收到的数据的字节数。

②USART_RX_BUF[USART_RX_STA&0X3FFF]=aRxBuffer[0],将aRxBuffer的第一个元素放入USART_RX_BUF(接收缓冲数组)的正确位置,这个位置由 USART_RX_STA按位与0X3FFF 决定。

USART_RX_STA++;

 将USART_RX_STA的值增1。

if(USART_RX_STA>(USART_REC_LEN-1))USART_RX_STA=0;

 ①USART_RX_STA>(USART_REC_LEN-1),当USART_RX_STA的值大于(USART_REC_LEN-1)时,将USART_RX_STA置零。

②USART_RX_STA=0,将USART_RX_STA置零。

二、总结

串口源文件(usart.h)中回调函数的程序代码流程如下图所示,

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值