本文是针对串口通信(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)中回调函数的程序代码流程如下图所示,