Чтение части файла с sd карты

vvadim
Offline
Зарегистрирован: 23.05.2012

На sd карту записан файл

11111
22222
33333

нужно прочитать часть файла, например 22222

при использовании функции seek() читается всё что после указателя до конца файла.
например 

myFile.seek(5);

читает

22222
33333

а нужно получить только 22222

есть какая то возможность указать диапазон чтения ?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Блин, ну не знаю уже сколько можно повторять в каждой теме одно и тоже:

КОД СЕКРЕТНЫЙ????

КАКОГО ... ВЫ ЗАДАЁТЕ ВОПРОСЫ ПО КОДУ, КОТОРЫЙ НЕ ПОКАЗЫВАЕТЕ????

Откуда же знать как именно Вы читаете? На Ваш вопрос в том виде, в каком Вы его задали, ответ получается только такой: "ну, блин, читай сколько надо, в чём проблема-то"?

А чтобы понять в чём Ваша прооблема, неплохо бы глянуть на код.

vvadim
Offline
Зарегистрирован: 23.05.2012
myFile = SD.open("asd.txt");
  if (myFile)
  { 
      myFile.seek(pos);   
      while (myFile.available())
      { 
        Serial.write(myFile.read());
      }
      myFile.close();
    } 
 

да какой там секретный

просто в данном случае (в моей ситуации ) код не причём.

я не нашёл в библиотеке как ограничить количество читаемых байт

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

vvadim пишет:
просто в данном случае (в моей ситуации ) код не причём.

Вы так в этом уверены? Ну, если Вы уже сами знаете что при чём, а что ни при чём, зачем вопросы задавать?

vvadim пишет:
я не нашёл в библиотеке как ограничить количество читаемых байт

Знаете. я ни разу не видел водопада Виктория, но это не значит, что его не существует.

Теперь по сути дела. Вариантов, как всегда, 100500.

Вариант 1 (если Вы знаете сколько именно байтов Вам надо читать)

1.1. можно воспользоваться функцией 

int read(void *buf, uint16_t nbyte);

Читает в предложенный буфер указанное количество байтов или меньше (если файл раньше кончится). Возвращает количество прочитанных байтов. Первый параметр - буфер, второй - количество байтов, которые надо читать. Точно также пишете

char szBuffer[32];
myFile.read(szBuffer, 5);

читается 5 байтов, не помню только в эти пять входит ограничительная точка или нет (поэкспериментируйте).

1.2. Можно не пользоваться той функцией, а вместо while (myFile.available()), написать что-нибудь более вразумительное, типа:

int n = 0;
for (; myFile.available() && n < 10; Serial.write(myFile.read()), n++);

Будет читать 10 байтов или меньше, если файл раньше закончится. После работы в переменной n находится количество реально прочитанных байтов.

Вариант 2 (если Вы не знаете сколько именно байтов Вам надо читать, а хотите читать пока не встретите какой-то признак по которому следует прекратить чтение)

Просто читаете как у Вас по ходу проверяя, что именно прочитали. Как встретился ограничивающий символ - прекращаете читать.

 

vvadim
Offline
Зарегистрирован: 23.05.2012

спасибо

попробую

о результатах отпишусь

vvadim
Offline
Зарегистрирован: 23.05.2012

сделал на варианте 1.2

ЕвгенийП - спасибо!

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Не за что

Rankle
Offline
Зарегистрирован: 31.10.2020

здравствуйте.

помогите разобраться. Прочитал описание функций работы с SD картой и не могу понять почему так происходит.

Да, читаю часть данных с карты но выводится в монитор порта какая-то ерунда.

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

File myFile;

char LightingOptionsModes[7];
uint32_t pos;
uint32_t current_pos = 10;

void setup() {
  Serial.begin(9600);
  Serial.print("Initializing SD card...");
  if (!SD.begin(6)) { Serial.println("initialization failed!"); return; }
  Serial.println("initialization done.");
  Serial.println("Read from config.txt...");
  SD.open("CONFIG.TXT", FILE_READ);
  
  myFile.seek(current_pos);   
  
  pos = myFile.position();
  for (int i=0; i<=6; i++)
      {
       LightingOptionsModes[i] = myFile.read();
      }
  myFile.close();
  Serial.println(LightingOptionsModes);   
  Serial.println(pos); 
}

Так вот

выводит в монитор порта следующее:

Initializing SD card...initialization done.
Read from config.txt...
⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮s
4294967295
 
Пробовал ставить три разных кодировки файла (ANSI, Юникод, UTF-8) и всегда вместо букв и цифр - кубики.
 
Содержание файла:
123456789012345678901234567890
123456789012345678901234567890
123456789012345678901234567890
123456789012345678901234567890
123456789012345678901234567890
123456789012345678901234567890
123456789012345678901234567890
123456789012345678901234567890
123456789012345678901234567890
123456789012345678901234567890
123456789012345678901234567890
123456789012345678901234567890
Monday1 Monday2   Monday3  
Monday4
Monday5
Monday6
Monday7
Monday8 Monday9   Monday0  
Monday11
Monday12
Monday13
Monday14  
 
Вопрос:
1. Помогите понять почему выводится такая ерунда (кубики)?
2. почему такая странная позиция в файле (4294967295). Атрибуты функции и переменных брал из справочника который нашел в инете).
 
b707
Offline
Зарегистрирован: 26.05.2017

Rankle пишет:

почему такая странная позиция в файле (4294967295). Атрибуты функции и переменных брал из справочника который нашел в инете).
 

4294967295 - это "-1".

судя по всему, команда seek() возвращает ошибку, ну и дальше ничего на самом деле не работает.

Посмотрите внимательно - у вас в коде переменная myFile нигде не инициализируется. откуда контроллер должен понять, что myFile - это именно config.txt ?

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

1. Если не понимаете, почему кубики, для начала выведите эти байты не как символы, а как числа. Думаю, что числа окажутся 255 из-за попытки чтения за пределами конца файла.

2. Вы нигде не проверяете, открылся ли файл, успешно ли завершилась попытка позиционирования... Отслеживайте ошибки и будете знать, что происходит в программе.

Rankle
Offline
Зарегистрирован: 31.10.2020

Спасибо.

Не предал этому значения.

Поменял 

SD.open("CONFIG.TXT", FILE_READ);

на 

myFile = SD.open("CONFIG.TXT", FILE_READ);

и всё заработало.