聪聪哥哥
【星允派 NEBULA PI】13:使用队列方式输出数据
队列是一种先进先出(FIFO)的线性数据结构,只允许在队尾插入元素,在队头删除元素。对于队列的操作包括:入队,出队,查看队头元素,判断队列是否为空的操作。
基本特性:先进先出的原则,最先进入队列的元素,最先被移除队列。
主要操作:
入队(enqueue):在队列的尾端添加元素。
出队(dequeue):在队列的首端移除元素。
队列的实现方式如下所示:
1:数组实现:
使用固定大小的数组
需要处理循环队列的情况以避免空间浪费
2:链表实现:
使用单向链表,头指针指向队首,尾指针指向队尾
不需要预先分配固定大小
二:主要代码分享:
2.1 定义队列的结构体
typedef struct TQelemType //队列每帧数据结构体
{
uint8_t uLength; //数据长度
uint8_t buffer[256]; //数据数组
}QelemType;
2.2队列初始化
/**************************************************************************
- 功能描述:队列初始化
- 参数说明:*s 队列句柄 *buf 队列结构体数据地址
- 返回说明:-1 失败 0 成功
**************************************************************************/
int8_t Initquene(squene *s, QelemType *buf)
{
s->base=buf;
if(!s->base)
return -1;
s->front=0;
s->rear=0;
return 0;
}
2.2 入队列操作:
/**************************************************************************
- 功能描述:入队列
- 参数说明:*s 队列句柄 *e 要入队列数据的地址
- 返回说明:无
**************************************************************************/
void enquene(squene *s,QelemType *e)
{
if(((s->rear)+1)%MAXSIZE==s->front)
{
return ;
}
memcpy(&(s->base[s->rear]), e, sizeof(QelemType));
s->rear=((s->rear)+1)%MAXSIZE;
}
2.3 出队列操作:
/**************************************************************************
- 功能描述:出队列
- 参数说明:*s 队列句柄 *e 出队列数据要写入的地址
- 返回说明:-1 失败 0 成功
**************************************************************************/
int8_t dequene(squene *s,QelemType *e)
{
if(s->rear==s->front)
{
return -1;
}
memcpy(e, &(s->base[s->front]), sizeof(QelemType));
memset(&(s->base[s->front]), 0, sizeof(QelemType));
s->front=((s->front)+1) % MAXSIZE;
return 0;
}
2.4 获取队列长度,初始化队列
/**************************************************************************
- 功能描述:获取队列长度
- 参数说明:*s 队列句柄
- 返回说明:队列中当前数据长度
**************************************************************************/
int length(squene *s)
{
return (s->rear - s->front + MAXSIZE) % MAXSIZE;
}
/**************************************************************************
- 功能描述:初始化所有应用的队列
- 参数说明:void
- 返回说明:void
**************************************************************************/
void Queue_Init(void)
{
Initquene(&QUsart1Tx, QUsart1TxData);
}
2.5 测试代码如下:
定义一下输出的字符串:
static unsigned char outputchar1[] ={ "nebula pi STM32F103VE 队列 test!\r\n" } ;
static unsigned char outputchar2[] ={ "nebula pi 跟着hugh 学习STM32 HAL 库!\r\n" } ;
void TestBuffer1(void)
{
QelemType Data = {0};
Data.uLength = sizeof (outputchar1); //需要发送的数据长度
memcpy(&Data,outputchar1,Data.uLength );
enquene(&QUsart1Tx,&Data);
}
void TestBuffer2(void)
{
QelemType Data = {0};
Data.uLength = sizeof (outputchar2); //需要发送的数据长度
memcpy(&Data,outputchar2,Data.uLength );
enquene(&QUsart1Tx,&Data);
}
void Usart1Txbuffer(void)
{
QelemType Data = {0},*PreData = NULL; //创建临时一帧队列数据
PreData = &Data;
if(dequene(&QUsart1Tx,PreData) != 0) //出队列
return;
memcpy(SendBuffer1,PreData->buffer,Data.uLength );
HAL_UART_Transmit(&huart1,SendBuffer1,Data.uLength,100);
}
三:实测图片如下所示:


源码地址如下所示:
https://gitee.com/congcong-brother/rymcus-evaluation-code-series.git
版块:
单片机/MCU论坛
2025/08/25 09:07

全部评论