以下是一个基于 ESP32 - S3 实现消息队列收发测试的 C 例程,该例程使用了 ESP - IDF(Espressif IoT Development Framework)。消息队列是 FreeRTOS 提供的一种机制,用于在不同任务之间传递数据。
代码实现
#include <stdio.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "freertos/queue.h"
// 定义消息队列句柄
QueueHandle_t xQueue;
// 发送任务
void vSenderTask(void *pvParameters) {
int sendValue = 0;
while (1) {
// 向消息队列发送数据
if (xQueueSend(xQueue, &sendValue, portMAX_DELAY) == pdPASS) {
printf("Sent value: %d\n", sendValue);
}
sendValue++;
// 任务延时 1 秒
vTaskDelay(pdMS_TO_TICKS(1000));
}
}
// 接收任务
void vReceiverTask(void *pvParameters) {
int receivedValue;
while (1) {
// 从消息队列接收数据
if (xQueueReceive(xQueue, &receivedValue, portMAX_DELAY) == pdPASS) {
printf("Received value: %d\n", receivedValue);
}
}
}
void app_main(void) {
// 创建消息队列,队列长度为 10,每个元素大小为 int 类型
xQueue = xQueueCreate(10, sizeof(int));
if (xQueue != NULL) {
// 创建发送任务
xTaskCreate(vSenderTask, "SenderTask", 2048, NULL, 1, NULL);
// 创建接收任务
xTaskCreate(vReceiverTask, "ReceiverTask", 2048, NULL, 1, NULL);
} else {
printf("Failed to create queue!\n");
}
}
代码解释
-
消息队列句柄:
QueueHandle_t xQueue;
:定义了一个消息队列句柄,用于后续对消息队列的操作。
-
发送任务
vSenderTask
:- 该任务会不断地向消息队列发送递增的整数。
xQueueSend(xQueue, &sendValue, portMAX_DELAY)
:将sendValue
的值发送到消息队列中。portMAX_DELAY
表示如果队列已满,任务会一直阻塞直到有空间可用。
-
接收任务
vReceiverTask
:- 该任务会不断地从消息队列接收数据。
xQueueReceive(xQueue, &receivedValue, portMAX_DELAY)
:从消息队列中接收数据并存储到receivedValue
中。portMAX_DELAY
表示如果队列为空,任务会一直阻塞直到有数据可用。
-
主函数
app_main
:xQueueCreate(10, sizeof(int))
:创建一个长度为 10 的消息队列,每个元素的大小为int
类型。- 如果消息队列创建成功,则创建发送任务和接收任务。
编译和运行
- 确保你已经安装了 ESP - IDF 开发环境。
- 将上述代码保存为
main.c
,并将其放在 ESP - IDF 项目的main
目录下。 - 在项目根目录下执行以下命令进行编译和烧录:
idf.py build idf.py -p /dev/ttyUSB0 flash # 根据实际情况修改串口设备名
- 打开串口监视器查看输出:
idf.py -p /dev/ttyUSB0 monitor
运行会看到发送任务不断发送递增的整数,接收任务不断接收并打印这些整数。