以下是一个基于 ESP32 - S3 实现消息队列收发测试的 C 例程
以下是一个基于 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
运行会看到发送任务不断发送递增的整数,接收任务不断接收并打印这些整数。