ESP32-cam аварийно завершает работу при закрытии потока с камерыC++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Гость
 ESP32-cam аварийно завершает работу при закрытии потока с камеры

Сообщение Гость »


Как и сказано в заголовке. Ниже приведен код файла cam.ino, который я взял из блога.

#include "esp_camera.h" WiFiServer camServer(81); bool подключен = ложь; WiFiClient live_client; String index_html = "\n" \ "\n" \ "#content {\n" \ "display: flex;\n" \ "flex-direction: столбец;\n" \ "justify-content: center;\n" \ "align-items: center;\n" \ "text-align: center;\n" \ "min-height: 100vh;}\n" \ "\n" \ "Прямая трансляция с камеры HTTP ESP32
Изображение
"; void configCamera(){ конфигурация camera_config_t; config.ledc_channel = LEDC_CHANNEL_0; config.ledc_timer = LEDC_TIMER_0; config.pin_d0 = Y2_GPIO_NUM; config.pin_d1 = Y3_GPIO_NUM; config.pin_d2 = Y4_GPIO_NUM; config.pin_d3 = Y5_GPIO_NUM; config.pin_d4 = Y6_GPIO_NUM; config.pin_d5 = Y7_GPIO_NUM; config.pin_d6 = Y8_GPIO_NUM; config.pin_d7 = Y9_GPIO_NUM; config.pin_xclk = XCLK_GPIO_NUM; config.pin_pclk = PCLK_GPIO_NUM; config.pin_vsync = VSYNC_GPIO_NUM; config.pin_href = HREF_GPIO_NUM; config.pin_sscb_sda = SIOD_GPIO_NUM; config.pin_sscb_scl = SIOC_GPIO_NUM; config.pin_pwdn = PWDN_GPIO_NUM; config.pin_reset = RESET_GPIO_NUM; config.xclk_freq_hz = 20000000; config.pixel_format = PIXFORMAT_JPEG; config.frame_size = FRAMESIZE_UXGA; config.jpeg_quality = 10; config.fb_count = 2; esp_err_t err = esp_camera_init(&config); если (ошибка!= ESP_OK) { Serial.printf("Ошибка инициализации камеры: ошибка 0x%x", err); возвращаться; } } //продолжаем отправку кадра камеры void liveCam(WiFiClient &client){ //захватываем кадр camera_fb_t * fb = esp_camera_fb_get(); если (!фб) { Serial.println("Буфер кадра не может быть получен"); возвращаться; } client.print("--frame\n"); client.print("Тип контента: изображение/jpeg\n\n"); клиент.flush(); client.write(fb->buf, fb->len); клиент.flush(); client.print("\n"); //возвращаем буфер кадра обратно для повторного использования esp_camera_fb_return (фб); } недействительный http_resp(){ Клиент WiFiClient = camServer.available(); /* проверяем, что клиент подключен */ если (client.connected()) { /* клиент отправляет запрос? */ /* запрос заканчивается на '\r' -> это формат протокола HTTP */ Строка req = ""; в то время как (client.available()) { req += (char)client.read(); } Serial.println("запрос" + req); /* Первая строка HTTP-запроса: «GET / HTTP/1.1». здесь «GET/» — это запрос на получение первой страницы в корне «/» «HTTP/1.1» — это HTTP версии 1.1. */ /* теперь мы анализируем запрос, чтобы увидеть, какую страницу хочет клиент */ int addr_start = req.indexOf("GET") + strlen("GET"); int addr_end = req.indexOf("HTTP", addr_start); if (addr_start == -1 || addr_end == -1) { Serial.println("Неверный запрос " + req); возвращаться; } req = req.substring(addr_start, addr_end); req.trim(); Serial.println("Запрос: " + req); клиент.flush(); Строка с; /* если запрос равен «/», то клиент запрашивает первую страницу в корне «/» -> мы обрабатываем это, возвращая «Hello world»*/ если (req == "/") { s = "HTTP/1.1 200 ОК\n"; s += "Тип контента: text/html\n\n"; с += index_html; с += "\п"; client.print(s); клиент.стоп(); } иначе, если (req == "/video") { live_client = клиент; live_client.print("HTTP/1.1 200 OK\n"); live_client.print("Тип контента: multipart/x-mixed-replace; граница=фрейм\n\n"); live_client.flush(); подключен = правда; } еще { /* если мы не можем найти страницу, которую запрашивает клиент, мы возвращаем 404 Файл не найден */ s = "HTTP/1.1 404 не найден\n\n"; client.print(s); клиент.стоп(); } } } недействительный startCamera() { camServer.begin(); КонфигКамера(); } недействительный camLoop() { http_resp(); если (подключено == верно) { liveCam (live_client); } } А это мой main.ino:

void setup() { Serial.begin(115200); Serial.setDebugOutput(истина); начатьWi-Fi(); НачатьКамеру(); } недействительный цикл() { кулачковый цикл(); } Поток с камеры работает нормально. Закрывая вкладку браузера, я получаю следующую ошибку:

Ошибка медитации гуру: в Ядре 1 возникла паника (LoadProhibited). Исключение не было обработано. Дамп регистра ядра 1: ПК: 0x400d751b PS: 0x00060330 A0: 0x800d763c A1: 0x3ffb21e0 A2: 0x00000000 A3: 0x00000000 A4: 0x00000e31 A5: 0x00000004 A6: 0x3ffc524c A7: 0x00000032 A8: 0x800d7854 A9: 0x3ffb21a0 A10: 0x3ffb21c4 A11: 0x00000000 A12: 0x00000e31 A13: 0x00000000 A14: 0x3ffc5260 A15: 0x00000001 SAR: 0x00000019 EXCCAUSE: 0x0000001c EXCVADDR: 0x00000010 LBEG: 0x4008b014 LEND: 0x4008b030 LCOUNT: 0xffffffff Обратная трассировка: 0x400d7518:0x3ffb21e0 0x400d7639:0x3ffb2210 0x400d2eb0:0x3ffb2230 0x400d4967:0x3ffb2250 0x400d496f:0x3ffb2270 0x400e5261:0x 3ffb2290 Думаю, это как-то связано с тем, что цикл простаивает? Но не уверен, как это исправить. Буду признателен за любую помощь. Заранее спасибо!
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C++»