Утилита посекторного чтения USB накопителя в файл

Вопрос в названии, никому не встречалась утилита чтения с USB Накопителя части секторов (указанных конкретных номеров) и чтоб собиралась в готовый файл.

P.S. В глобальном смысле задача другая стоит:

Пилю JPEG на STM32, встала задача передачи на комп готового файла на комп для просмотра/анализа результата. Поставил FatFS - работает через раз, файл записывает часть, короче несколько дней намучался - снес.

Я могу записывать напрямую на накопитель посекторно файл, но вопрос как удобно его на ПК перекинуть…

FAT пишет файл кусками, распихивая части в свободные от других файлов участки, поэтому и читать его надо своебразно, брать в текущем блоке ссылку на след. блок и потом его читать и так до конца файла. Мутотень короче. Но хуже было только когда ссылки были 12-битными (на дискетах), упакованными. Вот это был тихий звиздец, но об этом радист лучше расскажет, это он драйвер 800.com (это НЕ ссылка, не надо нажимать) пилил

Я все это понимаю, в 90ые кучу компов чинили после вирусов, вручную выковыривая файлы, поэтому и ищу утилиту, способную тупо вычитать подряд десяток секторов и записав это в файл.

а использовать sd карту не вариант ?
если не ошибаюсь там декодер нужен, из за того что файлы сокращаются… на мк не просмотреть просто файлы с компа… а с компа представление файла с мк (но это не точно)
#include <TJpg_Decoder.h> может пригодится… и вроде с JPEG и с JPG работает… чуть другим способом
https://github.com/Bodmer/JPEGDecoder я использовал эту библиотеку для вывода картинок на дисплей

есть еще файл переноса с телефона например файла на sd карту, на esp32(версия ядра есп <3) но по большей части там все на автомате делается, но может пригодится… и вроде сделать передачу на комп будет легко, особенно с ии…

#include <WiFi.h>
#include <ESPAsyncWebServer.h>
#include <SD.h>
#include <SPI.h>

const char* ssid = "ESP32-Access-Point"; // Имя точки доступа
const char* password = "123456789"; // Пароль точки доступа

AsyncWebServer server(80); // Создание асинхронного веб-сервера на порту 80

void setup() {
  Serial.begin(115200); // Инициализация последовательного порта
  
  // Инициализация точки доступа
  WiFi.softAP(ssid, password);
  Serial.println("Access Point started");

  // Получение IP-адреса
  IPAddress myIP = WiFi.softAPIP();
  Serial.print("ESP32 AP IP address: ");
  Serial.println(myIP); // Вывод IP-адреса в последовательный порт
  
  // Инициализация SD-карты
  if (!SD.begin()) {
    Serial.println("Ошибка инициализации SD-карты!");
    return;
  }
  Serial.println("SD-карта инициализирована успешно.");

  // Установка обработчика для корневого URL
  server.on("/", HTTP_GET, [](AsyncWebServerRequest *request){
    String html = "<html><body>";
    html += "<h1>Upload MP3 File</h1>";
    html += "<form action=\"/upload\" method=\"POST\" enctype=\"multipart/form-data\">";
    html += "<input type=\"file\" name=\"file\">";
    html += "<input type=\"submit\" value=\"Upload\">";
    html += "</form>";
    html += "</body></html>";
    request->send(200, "text/html", html); // Отправка HTML-страницы
  });

  // Установка обработчика для загрузки файла
  server.on("/upload", HTTP_POST, [](AsyncWebServerRequest *request){
    // Обработка загрузки файла
  }, handleFileUpload);

  // Запуск сервера
  server.begin();
  Serial.println("HTTP server started");
}

void loop() {
  // Обработка клиентов не требуется, так как используется асинхронный сервер
}

void handleFileUpload(AsyncWebServerRequest *request, String filename, size_t index, uint8_t *data, size_t len, bool final) {
  static File file; // Объявляем переменную file как статическую, чтобы она сохраняла свое значение между вызовами

  if (!index) {
    Serial.printf("Upload Start: %s\n", filename.c_str());
    
    // Открываем файл для записи на SD-карту
    file = SD.open("/" + filename, FILE_WRITE);
    if (!file) {
      Serial.println("Не удалось открыть файл для записи");
      request->send(500, "text/plain", "Не удалось открыть файл для записи");
      return;
    } else {
      Serial.printf("Файл %s успешно открыт для записи.\n", filename.c_str());
    }
  }

  // Записываем данные в файл
  if (len) {
    file.write(data, len);
    Serial.printf("Записано %d байт в файл %s\n", len, filename.c_str());
  }

  if (final) {
    file.close();
    Serial.printf("Файл %s успешно загружен\n", filename.c_str());
    request->send(200, "text/plain", "Файл загружен успешно");
  }
}

а если что то готовое ищите, из готового софта, то я не очень понял что вам надо, что бы посоветовать готовую программу…

мне необходимо вытащить файл из МК.

SD карту есть, на на нее FatFS пишет отвратительно, через раз.

Нашел:

DMDE (DM Disk Editor and Data Recovery Software)DMDE

Программа для посекторного чтения\записи - HPC

1 лайк