Чтение значения из файла внутри SD-карты

sd-card makefile

Можно ли считать значение из файла внутри SD-карты?

Я пытаюсь начать с примера кода

/*
  SD card read/write

 This example shows how to read and write data to and from an SD card file
 The circuit:
 * SD card attached to SPI bus as follows:
 ** MOSI - pin 11
 ** MISO - pin 12
 ** CLK - pin 13
 ** CS - pin 4

 created   Nov 2010
 by David A. Mellis
 modified 9 Apr 2012
 by Tom Igoe

 This example code is in the public domain.

 */

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

File myFile;

void setup() {
  // Открытие последовательной связи и ожидание открытия порта:
  Serial.begin(9600);
  while (!Serial) {
    ; // ждем подключения последовательного порта. Требуется только для родного порта USB
  }


  Serial.print("Initializing SD card...");

  if (!SD.begin(53)) {
    Serial.println("initialization failed!");
    return;
  }
  Serial.println("initialization done.");

  // открываем файл. обратите внимание, что одновременно может быть открыт только один файл,
  // так что вы должны закрыть это, прежде чем открывать другое.
  myFile = SD.open("test.txt", FILE_WRITE);

  // если файл открылся нормально пишем в него:
  if (myFile) {
    Serial.print("Writing to test.txt...");
    myFile.println("testing1 1, 2, 3.");
    myFile.println("testing2 1, 2, 3.");
    myFile.println("testing3 1, 2, 3.");
    // закрываем файл:
    myFile.close();
    Serial.println("done.");
  } else {
    // если файл не открылся, вывести ошибку:
    Serial.println("error opening test.txt");
  }

  // повторно открыть файл для чтения:
  myFile = SD.open("test.txt");
  if (myFile) {
    Serial.println("test.txt:");

    // читаем из файла, пока в нем больше ничего нет:
    while (myFile.available()) {
      Serial.write(myFile.read());
    }
    // закрываем файл:
    myFile.close();
  } else {
    // если файл не открылся, вывести ошибку:
    Serial.println("error opening test.txt");
  }
}

void loop() {
  // после настройки ничего не происходит
}

но здесь он прочитал все содержимое файла, я хочу прочитать только тестирование 3 части. Спасибо за помощь

, 👍0

Обсуждение

Да, это возможно. Пожалуйста, будьте более конкретными в том, что ваш фактический вопрос. Как и сейчас, это слишком расплывчато, чтобы на него можно было ответить., @Gerben

У вас есть какая-то часть этой работы? Например, у вас есть устройство со слотом для SD-карты? Он подключен к вашей Arduino? Ты умеешь что-нибудь читать или писать? Пожалуйста, попробуйте начать, а когда вы застрянете, опубликуйте конкретный вопрос с кодом., @Mark Smith

*возможно ли считать значение из файла внутри SD-карты?* - конечно можно. Иначе зачем бы вы подключали один?, @Nick Gammon


2 ответа


0

У вас есть 2 варианта сделать это, в зависимости от того, что именно вы хотите прочитать и как устроен ваш файл.

  1. Читайте с самого начала, пока не найдете то, что вам нужно. Выбросьте (только не оставляйте) то, что вам не нужно.
  2. Используйте метод File::seek(uint32_t), чтобы перейти к определенному байту в файле и прочитать оттуда. Полезно, только если вы уже знаете, где в файле находятся ваши данные.
,

как с ответом номер 1? Спасибо, @Francesco Valla

Точно так же, как и в примере кода. Вам просто нужно, чтобы программа проверила прочитанное и приняла решение, хочет она этого или нет., @Majenko

да, но я немного нуб, как? спасибо еще раз, @Francesco Valla

Вот подсказка: «Файл» — это «Поток». Так же и "Сериал". То, что вы можете сделать с «Serial», вы можете сделать с «File»., @Majenko

пример пожалуйста, @Francesco Valla

В вашем опубликованном вопросе уже есть пример чтения из файла., @Nick Gammon


1

я нашел это решение с использованием strcmp: когда я читаю файл, я сравниваю результат str, полученный из потока файла

/*
SD-карта чтение/запись

В этом примере показано, как читать и записывать данные в файл SD-карты и из него.
Схема:
* SD-карта подключена к шине SPI следующим образом:
** MOSI - контакт 11
** МИСО - контакт 12
** CLK — контакт 13
** КС - контакт 4

создано в ноябре 2010 г.
Дэвид А. Меллис
изменено 9 апреля 2012 г.
Том Айгоу

Этот пример кода находится в общественном достоянии.

*/

#include <SD.h>

File myFile;
char buf[10];

void setup()
{
// Открытие последовательной связи и ожидание открытия порта:
 Serial.begin(9600);
  while (!Serial) {
   ; // ждем подключения последовательного порта. Нужен только для Леонардо
 }


 Serial.print("Initializing SD card...");
 // На плате Ethernet Shield CS — это контакт 4. По умолчанию он установлен как выход.
 // Обратите внимание, что даже если он не используется в качестве вывода CS, аппаратный вывод SS
 // (10 на большинстве плат Arduino, 53 на Mega) нужно оставить как выход
 // или функции библиотеки SD не будут работать.
  pinMode(10, OUTPUT);

 if (!SD.begin(53)) {
   Serial.println("initialization failed!");
   return;
 }
 Serial.println("initialization done.");  

 // повторно открыть файл для чтения:
 myFile = SD.open("test.txt");
 if (myFile) {
   Serial.println("test.txt:");

   // читаем из файла, пока в нем больше ничего нет:
   while (myFile.available()) {
      myFile.read(buf,2);       
       if(strncmp(buf, "12", 2) == 0)//для длины я использую 2, потому что я ищу число с 2 цифрами
       {
           Serial.println("Match!");
           }
          break;     
       }
   }
   // закрываем файл:
   myFile.close();
 } else {
  // если файл не открылся, вывести ошибку:
   Serial.println("error opening test.txt");
 }
}

void loop()
{
  // после настройки ничего не происходит
}
,