1.队列.h文件
#define QueueUARTRxMax 5 /*!< UART队列最大深度 */
#define QueueUARTRxBufMax 100 /*!< UART接收最大数据长度 */
#define QueueUARTTxMax 1 /*!< UART队列最大深度 */
#define QueueUARTTxBufMax 100 /*!< UART接收最大数据长度 */
/**
* @brief UART接收参数
*/
typedef struct
{
uint32_t Count; /*!< UART接收数据数量 */
uint8_t Buffer[QueueUARTRxBufMax]; /*!< UART接收数据数量 */
} Queue_UART_Para;
/**
* @brief UART接收队列
*/
typedef struct
{
Queue_UART_Para *Start; /*!< UART接收队列数据起始地址 */
Queue_UART_Para *In; /*!< UART接收队列数据起始地址 */
Queue_UART_Para *Out; /*!< UART接收队列数据起始地址 */
Queue_UART_Para *End; /*!< UART接收队列数据起始地址 */
uint16_t Size; /*!< UART接收队列使用量 */
uint16_t Free_Size; /*!< UART接收队列空闲量 */
} Queue_UART_Struct;
2.队列.c文件
/*********************************************************************
* @fn Queue_UART_Init
*
* @brief UART队列初始化.
*
* @param Que:队列
*
* @param Buf:队列数组
*
* @param Buf_Len:队列长度
*
* @return none
*/
void Queue_UART_Init(Queue_UART_Struct* Que, Queue_UART_Para* Buf, uint8_t Buf_Len)
{
Que->Start =
Que->In =
Que->Out = &Buf[0];
Que->End = &Buf[Buf_Len - 1];
Que->Size =
Que->Free_Size = Buf_Len;
}
/*********************************************************************
* @fn Queue_UART_Push_aData
*
* @brief UART队列放入一个数据.
*
* @param Que:队列
*
* @param Data:数据
*
* @return Queue_StatusTypeDef:压入队列成功或失败
*/
Queue_StatusTypeDef Queue_UART_Push_aData(Queue_UART_Struct* Que, Queue_UART_Para Data)
{
if (Que->Free_Size == 0)
{
return Queue_ERROR;
}
*Que->In = Data;
Que->Free_Size--;
Que->In++;
if (Que->In > Que->End)
{
Que->In = Que->Start;
}
return Queue_OK;
}
/*********************************************************************
* @fn Queue_UART_Pop_aData
*
* @brief UART队列取出一个数据.
*
* @param Que:队列
*
* @param Data:数据
*
* @return Queue_StatusTypeDef:取出数据成功或失败
*/
Queue_StatusTypeDef Queue_UART_Pop_aData(Queue_UART_Struct* Que, Queue_UART_Para* Data)
{
if (Que->Free_Size >= Que->Size)
{
return Queue_ERROR;
}
*Data = *Que->Out;
Que->Free_Size++;
Que->Out++;
if (Que->Out > Que->End)
{
Que->Out = Que->Start;
}
return Queue_OK;
}
3.例程
创建队列句柄
Queue_UART_Struct Queue_UART_Rx;
Queue_UART_Struct Queue_UART_CDC_USB_Rx;
队列初始化
static void Function_Queue_Init_Config(void)
{
static Queue_UART_Para Queue_UART_Rx_Buf[QueueUARTRxMax];
static Queue_UART_Para Queue_UART_CDC_USB_Rx_Buf[QueueUARTRxMax];
Queue_UART_Init(&Queue_UART_Rx, &Queue_UART_Rx_Buf[0], QueueUARTRxMax);
Queue_UART_Init(&Queue_UART_CDC_USB_Rx, &Queue_UART_CDC_USB_Rx_Buf[0], QueueUARTRxMax);
}
队列用宏重命名
#define Function_Queue_UART_Rx_Push_aData(Queue_UART_Para) Queue_UART_Push_aData(&Queue_UART_Rx, Queue_UART_Para)
#define Function_Queue_UART_Rx_Pop_aData(Queue_UART_Para) Queue_UART_Pop_aData(&Queue_UART_Rx, Queue_UART_Para)
#define Function_Queue_UART_CDC_USB_Rx_Push_aData(Queue_UART_Para) Queue_UART_Push_aData(&Queue_UART_CDC_USB_Rx, Queue_UART_Para)
#define Function_Queue_UART_CDC_USB_Rx_Pop_aData(Queue_UART_Para) Queue_UART_Pop_aData(&Queue_UART_CDC_USB_Rx, Queue_UART_Para)