1. 定义队列传输的内容和队列结构体对象
使用 xQueueHandle结构体创建对象
typedef struct
{
u8 TaskNum;
u8 Cmd;
u8 * buf;
}QueueObject_t;
xQueueHandle xQueue = NULL;
2. 调用xQueueCreate API创建队列
xQueueCreate()函数:用于创建一个消息队列。
QueueHandle_t xQueueCreate( UBaseType_t uxQueueLength, UBaseType_t uxItemSize );
参数说明:
uxQueueLength: 消息队列的长度,即可以存放多少个元素。
uxItemSize: 每个元素的大小,以字节为单位。
返回值:
QueueHandle_t类型的指针,代表创建的消息队列。若创建失败,则返回NULL。
创建xQueue队列
xQueue = xQueueCreate(20, sizeof(QueueObject_t));
3. 在任务中调用API获取队列消息
xQueueReceive()函数:用于接收消息队列中的数据。
BaseType_t xQueueReceive( QueueHandle_t xQueue, void *pvBuffer, TickType_t xTicksToWait );
参数说明:
xQueue:需要接收数据的消息队列。
pvBuffer:用于存放接收到的数据的内存地址。
xTicksToWait:在未接收到数据时等待的时间。若设置为0,则表示不等待;若设置为portMAX_DELAY则表示无限等待。
返回值:
若接收到数据,则返回pdPASS(1);否则,返回errQUEUE_EMPTY。
接收队列消息
void Process_Task(void *pvParameters)
{
const TickType_t xMaxBlockTime = pdMS_TO_TICKS(200);
BaseType_t xResult = pdFALSE;
QueueObject_t xQueueObject = {0};
while (1)
{
xResult = xQueueReceive(xcQueue, (void *)&xQueueObject , xMaxBlockTime);
if (pdPASS == xResult)
{
/* 接收到的数据保存在xQueueObject 结构体对象里面 */
}
}
}
4. 调用API向队列发送数据
xQueueSend()函数:用于向消息队列中发送数据。
BaseType_t xQueueSend( QueueHandle_t xQueue, const void *pvItemToQueue, TickType_t xTicksToWait );
参数说明:
xQueue:需要发送数据的消息队列。
pvItemToQueue:待发送的数据的内存地址。
xTicksToWait:在消息队列已满时等待的时间。若设置为0,则表示不等待;若设置为portMAX_DELAY则表示无限等待。
返回值:
若发送成功,则返回pdPASS(1);否则,返回errQUEUE_FULL。
向队列中发送数据
传递数据时需注意,Queuebject.buf 指针必须指向一个已分配内存地址的空间,不能传递野指针
void SendxQueue(void)
{
u8 buf[10]={1,2,3};
Queueject_t Queuebject = {0};
Queuebject.TaskNum = 0x11;
Queuebject.Cmd = 0x01;
Queuebject.buf = (u8 *)&buf;
xQueueSend(xQueue, (void *)&xCommObject, pdMS_TO_TICKS(10));
}
5. 完整示例
//定义消息体的数据结构
typedef struct
{
u8 TaskNum;
u8 Cmd;
u8 * buf;
}QueueObject_t;
//创建消息队列的对象
xQueueHandle xQueue = NULL;
//获取消息队列数据
void Process_Task(void *pvParameters)
{
const TickType_t xMaxBlockTime = pdMS_TO_TICKS(200);
BaseType_t xResult = pdFALSE;
QueueObject_t xQueueObject = {0};
while (1)
{
xResult = xQueueReceive(xcQueue, (void *)&xQueueObject , xMaxBlockTime);
if (pdPASS == xResult)
{
/* 接收到的数据保存在xQueueObject 结构体对象里面 */
}
}
}
//向消息队列发送数据
void SendxQueue(void)
{
u8 buf[10]={1,2,3};
Queueject_t Queuebject = {0};
Queuebject.TaskNum = 0x11;
Queuebject.Cmd = 0x01;
Queuebject.buf = (u8 *)&buf;
xQueueSend(xQueue, (void *)&xCommObject, pdMS_TO_TICKS(10));
}
————————————————
版权声明:本文为CSDN博主「图南楠」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_41975640/article/details/134181274
|