//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);
}
}
//结束!