70061【FREERTOS】不同任务之间,创建队列发送消息

1.mqtt任务里

初始化定义

// 🔧 队列:用于从 SHT30 任务传递温湿度数据到 MQTT 任务
static QueueHandle_t sensor_data_queue = NULL;
#define SENSOR_QUEUE_SIZE 5

定时器中断里

    // 🔧 从队列接收数据(非阻塞)
    if (xQueueReceive(sensor_data_queue, json_payload, 0) == pdTRUE) {
        int msg_id = esp_mqtt_client_publish(mqtt_client, "zhuwo_temp", json_payload, 0, 0, 0);
        if (msg_id >= 0) {
            ESP_LOGI(TAG, "📤 Published from queue: %s (msg_id=%d)", json_payload, msg_id);
        } else {
            ESP_LOGW(TAG, "❌ Failed to publish: %s", json_payload);
        }
    } else {
        ESP_LOGD(TAG, "⏸️  Queue empty, waiting for sensor data...");
    }

在主程序里

    // 🔧 创建传感器数据队列
    if (sensor_data_queue == NULL) {
        sensor_data_queue = xQueueCreate(SENSOR_QUEUE_SIZE, 128);  // 队列大小5,每条消息128字节
        if (sensor_data_queue == NULL) {
            ESP_LOGE(TAG, "Failed to create sensor data queue");
        } else {
            ESP_LOGI(TAG, "✅ Sensor data queue created (size: %d)", SENSOR_QUEUE_SIZE);
        }
    }

2.SHT30任务里

主任务里

            // 🔧 构建 JSON 数据并发送到 MQTT 队列
            char json_payload[128];
            int written = snprintf(json_payload, sizeof(json_payload),
                                   "{\"temp\":%.2f,\"humi\":%.2f}", 
                                   temperature, humidity);
            
            if (written > 0 && written < (int)sizeof(json_payload)) {
                esp_err_t send_ret = mqtt_send_sensor_data(json_payload);
                if (send_ret == ESP_OK) {
                    ESP_LOGI(TAG, "📤 Data sent to MQTT queue: %s", json_payload);
                } else {
                    ESP_LOGW(TAG, "⚠️  Failed to send to queue: %s", json_payload);
                }
            }
/**
 * @brief 发送传感器数据到 MQTT 队列
 */
esp_err_t mqtt_send_sensor_data(const char *json_payload)
{
    if (sensor_data_queue == NULL) {
        ESP_LOGE(TAG, "Sensor data queue not initialized");
        return ESP_FAIL;
    }
    
    if (json_payload == NULL) {
        ESP_LOGE(TAG, "Invalid json_payload");
        return ESP_ERR_INVALID_ARG;
    }
    
    // 发送到队列(非阻塞)
    if (xQueueSend(sensor_data_queue, json_payload, 0) != pdTRUE) {
        ESP_LOGW(TAG, "⚠️  Sensor queue full, data dropped: %s", json_payload);
        return ESP_FAIL;
    }
    
    ESP_LOGD(TAG, "✅ Sensor data queued: %s", json_payload);
    return ESP_OK;
}
© 版权声明
THE END
喜欢就支持一下吧
点赞21 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容