乐鑫技术交流
直播中

池鹄展

9年用户 1021经验值
擅长:可编程逻辑 电源/新能源
私信 关注
[问答]

使用esp32读取dht11模块的数据,使用mqtt上传到阿里云时发生重启,为什么?

idf版本:4.4
esp版本:esp32-wroom-32
我在使用esp32读取dht11模块的数据,使用mqtt上传到阿里云时发生重启,没有找到问题

  • assert failed: xQueueSemaphoreTake queue.c:1549 (pxQueue->uxItemSize == 0)


  • Backtrace:0x40081a6a:0x3ffcc3000x400884a5:0x3ffcc320 0x4008f0b5:0x3ffcc340 0x40089372:0x3ffcc460 0x40089530:0x3ffcc4a0 0x400da3fe:0x3ffcc4c0 0x400d70d0:0x3ffcc500 0x4008b63d:0x3ffcc5f0
  • 0x40081a6a: panic_abort at D:/tools/espressif/Espressif/frameworks/esp-idf-v4.4.2/components/esp_system/panic.c:402

  • 0x400884a5: esp_system_abort at D:/tools/espressif/Espressif/frameworks/esp-idf-v4.4.2/components/esp_system/esp_system.c:128

  • 0x4008f0b5: __assert_func at D:/tools/espressif/Espressif/frameworks/esp-idf-v4.4.2/components/newlib/assert.c:85

  • 0x40089372: xQueueSemaphoreTake at D:/tools/espressif/Espressif/frameworks/esp-idf-v4.4.2/components/freertos/queue.c:1549 (discriminator 1)

  • 0x40089530: xQueueTakeMutexRecursive at D:/tools/espressif/Espressif/frameworks/esp-idf-v4.4.2/components/freertos/queue.c:731

  • 0x400da3fe: esp_mqtt_client_publish at D:/tools/espressif/Espressif/frameworks/esp-idf-v4.4.2/components/mqtt/esp-mqtt/mqtt_client.c:1802

  • 0x400d70d0: get_dht11 at D:/tools/espressif/Espressif/frameworks/esp-idf-v4.4.2/MyProject/tcp-V4/main/app_main.c:86

  • 0x4008b63d: vPortTaskWrapper at D:/tools/espressif/Espressif/frameworks/esp-idf-v4.4.2/components/freertos/port/xtensa/port.c:131


  • ELF file SHA256: c577a7c13b8387c1

  • Rebooting...



GeSHi © Codebox Plus Extension


我创建了一个Task任务 get_dht11(),每次执行到esp_mqtt_client_publish这里就报上面的错误
Code: [Select all] [Expand/Collapse]

  • static char my_topic[50 = "/sys/%s/%s/thing/event/property/post";
  • static char my_topic_publish[150 = "{"version": "1.0",     "params": {       "temperature": %.1f,      "Humidity": %.1f  },  "method": "thing.event.property.post" }";

  • void get_dht11(void * pClient){
  •     int dht11_status;
  •     float temperature;
  •     float humidity;
  •     unsigned int loopTimes = 1;

  •     static char MY_TOPIC_COMPONENTS[64 = {0};
  •     snprintf(MY_TOPIC_COMPONENTS, sizeof(MY_TOPIC_COMPONENTS),my_topic , EXAMPLE_PRODUCT_KEY,EXAMPLE_DEVICE_NAME);

  •     char MY_TOPIC_PUBLISH_COMPONENTS[200 = {0};
  •     int msg_id;
  •     //portMUX_TYPE mmux = portMUX_INITIALIZER_UNLOCKED;
  •     while (1)
  •         {
  •             if(mqtt_link_status == true){
  •                 dht11_status = DHT11_read();
  •                 ESP_LOGI(TAG, "loopTimes:%d n",loopTimes++);

  •                  if(dht11_status == DHT_SUCCESS){
  •                     temperature = humidity = 0;
  •                     temperature = get_temperature();
  •                     humidity = get_humidity();
  •                     ESP_LOGI(TAG, "temperature:%.1f;    humidity:%.1f   n",temperature,humidity);

  •                     memset(MY_TOPIC_PUBLISH_COMPONENTS, 0, 200);
  •                     snprintf(MY_TOPIC_PUBLISH_COMPONENTS, sizeof(MY_TOPIC_PUBLISH_COMPONENTS),my_topic_publish , temperature,humidity);

  •                     ESP_LOGI(TAG, "sendTopic:%s n",MY_TOPIC_COMPONENTS);
  •                     ESP_LOGI(TAG, "sendMSG:%s   n",MY_TOPIC_PUBLISH_COMPONENTS);
  •                     //taskENTER_CRITICAL(&mmux);
  •                     msg_id = esp_mqtt_client_publish(*(esp_mqtt_client_handle_t *)pClient, MY_TOPIC_COMPONENTS, MY_TOPIC_PUBLISH_COMPONENTS, 0, 1, 0);
  •                     //taskEXIT_CRITICAL(&mmux);
  •                     ESP_LOGI(TAG, "sent publish successful, msg_id=%d", msg_id);

  •                  }else{
  •                     ESP_LOGI(TAG, "Error: %d", dht11_status);
  •                  }
  •             }
  •             vTaskDelay(DHT11_TASK_DELAY / portTICK_PERIOD_MS);
  •         }

  • }



回帖(1)

贾大林

2024-6-6 18:15:42
从您提供的信息来看,ESP32在使用DHT11模块读取数据并上传到阿里云时发生重启。错误信息显示为:assert failed: xQueueSemaphoreTake queue.c:1549 (pxQueue->uxItemSize == 0)。这可能是由于以下原因导致的:

1. **内存不足**:ESP32在运行过程中可能遇到了内存不足的问题。请检查您的代码,确保没有内存泄漏或过度分配内存的情况。

2. **任务调度问题**:在使用FreeRTOS时,可能存在任务调度的问题。请检查您的任务优先级设置,确保任务能够正常切换。

3. **队列问题**:错误信息中提到了队列(queue),可能是队列的使用方式不正确。请检查您的队列创建和使用方式,确保遵循FreeRTOS的规范。

4. **DHT11模块通信问题**:请检查DHT11模块与ESP32之间的通信是否正常。确保连接正确,并且DHT11模块没有损坏。

5. **MQTT连接问题**:请检查您的MQTT连接设置,确保连接到阿里云的MQTT服务器没有问题。

为了解决这个问题,您可以尝试以下步骤:

1. **检查内存使用情况**:使用ESP-IDF的内存调试工具,如`esp_heap_caps_dump()`和`esp_heap_caps_check_integrity()`,检查内存使用情况和潜在的内存问题。

2. **优化任务调度**:检查任务优先级设置,确保任务能够正常切换。您可以尝试降低任务优先级,或者使用`vTaskDelay()`来增加任务切换的机会。

3. **检查队列使用**:确保您的队列创建和使用方式正确。遵循FreeRTOS的队列使用规范,避免使用错误的参数或方法。

4. **检查DHT11模块通信**:检查DHT11模块与ESP32之间的连接,确保通信正常。您可以尝试使用其他设备测试DHT11模块,以排除模块本身的问题。

5. **检查MQTT连接**:检查您的MQTT连接设置,确保连接到阿里云的MQTT服务器没有问题。您可以尝试连接到其他MQTT服务器,以排除服务器问题。

通过以上步骤,您应该能够找到导致ESP32重启的原因,并采取相应的措施解决问题。
举报

更多回帖

×
20
完善资料,
赚取积分