芯查查logo
  • 物料选型
  • 数据服务
    1. 新产品
    2. 查替代
    3. 丝印反查
    4. 查品牌
    5. PCN/PDN
    6. 查方案
    7. 查代理
    8. 数据合作
  • 应用方案
  • SaaS产品
      SaaS产品
    1. 供应链波动监测预警
    2. 半导体产业链地图
    3. 智能BOM管家
    4. 解决方案
    5. 汽车电子
    6. 政府机构
    7. 数据API
  • 商城
  • 行业资讯
    1. 资讯
    2. 直播
  • 论坛社区
    1. 论坛
    2. 学习
    3. 测评中心
    4. 活动中心
    5. 积分商城
  • 查一下
正在使用账号登录iCEasy商城
聪聪哥哥
【星允派 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
  • 举报
😁😂😃😄😅😆😉😊😋😌😍😏😒😓😔😖😘😚😜😝😞😠😡😢😣😤😥😨😩😪😫😭😰😱😲😳😵😷😸😹😺😻😼😽😾😿🙀🙅🙆🙇🙈🙉🙊🙋🙌🙍🙎🙏✂✅✈✉✊✋✌✏✒✔✖✨✳✴❄❇❌❎❓❔❕❗❤➕➖➗➡➰🚀🚃🚄🚅🚇🚉🚌🚏🚑🚒🚓🚕🚗🚙🚚🚢🚤🚥🚧🚨🚩🚪🚫🚬🚭🚲🚶🚹🚺🚻🚼🚽🚾🛀Ⓜ🅰🅱🅾🅿🆎🆑🆒🆓🆔🆕
@好友

全部评论

加载中
游客登录通知
已选择 0 人
自定义圈子
移动
发布帖子
发布动态
发布问答
最新帖子
同样画一块4层板,高手3天改1次,新手改3版花9天,关键在这工程审核连退我3次,这10个DFM致命坑,中5个以上报价翻倍做了3年硬件,才明白PCB降本不是一味压价,从这5个环节省钱出于成本考量,怎样设计一块高效的PCB电路板?个人电子元器件管理系统
热门版块
查看更多
萤火工场
问型号
问技术
问行情
每日打卡
电子元器件
飞腾
开源硬件项目
机器人开源工坊
电子DIY

13

收藏

分享

微信扫码
分享给好友

评论