STM32 HAL库串口不定字长接收(滚动数组接收)

//Cube串口中断自动生成代码部分不粘贴了。

//博主使用串口2.

//自定义一个结构体:

#define  CmdLength  1024
static USART2_Rxbuffer USART2_Rx = {0};
static uint8_t Head_flag = FALSE;

typedef struct __USART2_Rxbuffer
{
	uint32_t Head;
	uint32_t Last_head;
	uint32_t Tail;
	uint8_t huart2_Rxbuffer[CmdLength]; 
	uint8_t huart2_Rxflag;
    uint8_t Rx_Firstflag;
    uint32_t RxCounter;

} USART2_Rxbuffer;

HAL_StatusTypeDef  Usart2Recieve(uint8_t *pData)
{ 
	uint8_t i = 0;

	/* first in , hang the interrupt. */
	if (!USART2_Rx.Rx_Firstflag) 
	{
		if (HAL_UART_Receive_IT(&huart2, &USART2_Rx.huart2_Rxbuffer[USART2_Rx.RxCounter++], 1) == HAL_OK)
		{
			USART2_Rx.Head = USART2_Rx.RxCounter - 1;
			USART2_Rx.Rx_Firstflag = TRUE;
			printf("USART2_Rx interrupt Open
");
		}
	}

	if (USART2_Rx.huart2_Rxflag == TRUE)
	{
		HAL_Delay(1);
		USART2_Rx.huart2_Rxflag = FALSE;
		Head_flag = TRUE;
		
		if (USART2_Rx.RxCounter == 1)
		{
			USART2_Rx.Tail = CmdLength;
		}
		else
		{
			USART2_Rx.Tail = USART2_Rx.RxCounter - 1;
		}
		USART2_Rx.Last_head = USART2_Rx.Tail;

		if (USART2_Rx.Head <= USART2_Rx.Tail)
		{
			for(i = 0; i < (USART2_Rx.Tail - USART2_Rx.Head); i++)
			{
				pData[i % CmdLength] = USART2_Rx.huart2_Rxbuffer[(USART2_Rx.Head + i) % CmdLength];
			}
		}
		else
		{
			for (i = 0; i < (CmdLength - USART2_Rx.Head); i++)
			{
				pData[i % CmdLength] = USART2_Rx.huart2_Rxbuffer[(USART2_Rx.Head + i) % CmdLength];
			}
			
			for (i = CmdLength - USART2_Rx.Head; i < (CmdLength - USART2_Rx.Head + USART2_Rx.Tail); i++)
			{
				pData[i % CmdLength] = USART2_Rx.huart2_Rxbuffer[i % CmdLength];
			}
		} 

		return HAL_OK; 
	}

	return HAL_BUSY;
}

//改造回调函数,因为HAL库,1 byte 接收完成 会失能中断,所以我们需要再次挂起中断。

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{ 
	HAL_StatusTypeDef ret = HAL_OK;

	if (huart->Instance == USART2)
	{
		do
		{
			if (USART2_Rx.RxCounter >= CmdLength)
			{
				USART2_Rx.RxCounter = 0;
			}

			if (Head_flag)
			{
				USART2_Rx.Head = USART2_Rx.Last_head;
				Head_flag = FALSE;
			}
			/* hang the interrupt again. */ 
			ret = HAL_UART_Receive_IT(&huart2, &USART2_Rx.huart2_Rxbuffer[USART2_Rx.RxCounter++], 1); 			
		}while(ret != HAL_OK);

		USART2_Rx.huart2_Rxflag = TRUE; 
   		// printf(" Receive Finished
");
	}
	else
	{
	     UNUSED(huart);
	}
}

//结束!
经验分享 程序员 微信小程序 职场和发展