• Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

Не пойму, где ошибка кода

aZholtikov

Active member
Пример:
Код:
/* Flash Split for 4M chips */
/* sketch @0x40200000 (~1019KB) (1044464B) */
/* empty  @0x402FEFF0 (~3056KB) (3129360B) */
/* spiffs @0x405FB000 (~0KB) (0B) */
/* eeprom @0x405FB000 (4KB) */
/* rfcal  @0x405FC000 (4KB) */
/* wifi   @0x405FD000 (12KB) */
 

ospkant777

New member
Вообщем сколько библиотек не перепробовал, не могу подключить, чтобы через FTP клиент можно было наблюдать SD карту. В интернете есть китайский ролик, как на компьютере именно сд карта открывается. На флеш память без проблем записываю и стираю с нее. Блин, как правильно сделать? На какую библиотеку заменить SPIFFS (не важно, хоть Little FS), чтобы открывалась сд карта? Или что добавить в код?

выложу код (не обращайте внимание на OLDE, для меньшего отвлечения, я пока строки удалил)

#include <Arduino.h>
#include <ESP8266WiFi.h>
#include <ESP8266FtpServer.h>
#include <GyverOLED.h>
#include <SD.h>


const char* ssid = "SSS";
const char* password = "123";
const uint8_t csPin = SS; // pin SD shield
FtpServer ftpSrv; //set #define FTP_DEBUG in ESP8266FtpServer.h to see ftp verbose on serial
GyverOLED<SSD1306_128x64, OLED_NO_BUFFER> oled; // 1306 подключать к пинам D1 (GPIO5,SCL) и D2 (GPIO4,SDA)

void setup() {

Serial.begin(9600);
SPIFFS.begin();
WiFi.begin(ssid, password);
Serial.println("");
if(!SD.begin(csPin)) {
Serial.println("Error initializing SD card");
return;
}
SD.begin(csPin);
Serial.println("SD Card is avalible...");
delay(2000);

// Wait for connection
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.print("Connected to ");
Serial.println(ssid);
Serial.print("IP address: ");
Serial.println(WiFi.localIP());
if (SPIFFS.begin()) {
Serial.println("SPIFFS opened!");
ftpSrv.begin("ftp","ftp"); //username, password for ftp. set ports in ESP8266FtpServer.h (default 21, 50009 for PASV)
}
}
void loop() {

ftpSrv.handleFTP(); //make sure in loop you call handleFTP()!!

}


Этот пример кода нормально соединяет с FTP клиентом, нормально передает любые файлы во флеш, но как сделать так, чтобы каталог сд карты открылся - ума не приложу. СД карта рабочая, файлы в есп-ишке читает и списком выдает по этому коду:

File dirSD = SD.open("/"); // Открытие корневой директории
// Проверка, удалось ли открыть директорию
if (dirSD) {
// Перебор всех файлов в директории
while (true) {
File entry = dirSD.openNextFile();

// Если файл не найден, выходим из цикла
if (!entry) {
break;
}
// Если это файл, выводим его имя
if (!entry.isDirectory()) {
Serial.println(entry.name());
}
// Закрываем файл
entry.close();
}
// Закрываем директорию
dirSD.close();

Может пошлете в нужном направлении?
 

ospkant777

New member
Короче сам отвечу на свой вопрос. Неправильный был подход, надо было не менять файловую систему и открывать SD через FTP, а сделать HTTP с адресацией пути на SD. Статья и код взяты отсюда. Буду переделывать под свои нужды.
 

CodeNameHawk

Moderator
Команда форума
Это не ftp.
надо было не менять файловую систему
Так файловую систему на SD не поменяете, она там своя.
Если нужен ftp, то читаете как он работает и в нужные моменты подсовываете ему то, что что он просит, прочитав это с SD.
 

ospkant777

New member
Спасибо, уже переделал на 80 порт. Теперь через HTTP отправляю файл, вот только одна задача опять вырисовалась: строка uploadSD.write(uploadHTML.buf, uploadHTML.currentSize); перезаписывает из буфера в созданный мною файл постоянно, и получается, если отправлять файл через POST 3000байт, то на SD записывается всего последние 952 байта, а первая часть (2048 байт, как раз размер буфера) не записываются. Как бы это все в цикл завести, чтобы все записалось?
 

ospkant777

New member
Да я все удалил и переделал на ESP8266WebServer )) Теперь не могу соединить void handleRoot() и void handleFileUpload(). От void handleRoot() при нажатии кнопки Upload должен идти POST запрос и ESP8266WebServer должен его обработать, а далее отправить "UPLOAD_FILE_START", которую проверяет handleFileUpload(), а вместо UPLOAD_FILE_START идет значение "2" не пойму как исправить. С серверами особо не сталкивался. Всю информацию по кускам собираю.


C++:
void handleRoot() {
  String html = "<html><body>";
  html += "<form method=\"POST\" action=\"/upload\" enctype=\"multipart/form-data\">";
  html += "<input type="file" name="file">";
  html += "<input type="submit" value="Upload">";
  html += "</form></body></html>";
  delay(1000);
  server.send(200, "text/html", html);
}
C++:
void handleFileUpload() {
  HTTPUpload& uploadHTML = server.upload();
  Serial.println(uploadHTML.status);
  Serial.println(uploadHTML.filename);
  Serial.println(uploadHTML.totalSize);

  if (uploadHTML.status == UPLOAD_FILE_START || uploadHTML.status == UPLOAD_FILE_WRITE) {
    Serial.println(uploadHTML.filename);

    if (uploadHTML.status == UPLOAD_FILE_START) {
      // Начало загрузки файла - открываем файл для записи
      String filename = uploadHTML.filename;
      uploadFile = SD.open("/" + filename, "a");
      Serial.println ("create!");
    }

    else if (uploadHTML.status == UPLOAD_FILE_WRITE && uploadHTML.totalSize > 0) {
      // Запись части файла
      size_t bytesWritten = uploadFile.write(uploadHTML.buf, uploadHTML.currentSize);
      Serial.println ("write!");

      // Если размер буфера не превышен, продолжаем загрузку
      if (bytesWritten != uploadHTML.currentSize) {
        server.send(500, "text/plain", "Error upload file");
        Serial.println ("error!");
      }
    }
  }

  else if (uploadHTML.status == UPLOAD_FILE_END) {
    // Конец загрузки файла - закрываем файл и отсылаем ответ клиенту
    Serial.println ("upload!");
    Serial.println (uploadFile);
    uploadFile.close();
    Serial.println ("close!");
    server.send(200, "text/plain", "File upload");
  }
}
один ... не пойму, почему когда подключаюсь через IP адрес сервера, в блоке выбираю файл и отправляю... Все строки до else if (uploadHTML.status == UPLOAD_FILE_END) пропускает. Потом создал println (ну типа debug), увидел, что от handleRoot() через сервер идет значение "2" , а должно идти значение "UPLOAD_FILE_START". Вот в чем сейчас проблема.
 
Сверху Снизу