Чтение части файла с sd карты
- Войдите на сайт для отправки комментариев
Вс, 07/02/2016 - 13:42
На sd карту записан файл
11111
22222
33333
нужно прочитать часть файла, например 22222
при использовании функции seek() читается всё что после указателя до конца файла.
например
myFile.seek(5);
читает
22222
33333
а нужно получить только 22222
есть какая то возможность указать диапазон чтения ?
Блин, ну не знаю уже сколько можно повторять в каждой теме одно и тоже:
КОД СЕКРЕТНЫЙ????
КАКОГО ... ВЫ ЗАДАЁТЕ ВОПРОСЫ ПО КОДУ, КОТОРЫЙ НЕ ПОКАЗЫВАЕТЕ????
Откуда же знать как именно Вы читаете? На Ваш вопрос в том виде, в каком Вы его задали, ответ получается только такой: "ну, блин, читай сколько надо, в чём проблема-то"?
А чтобы понять в чём Ваша прооблема, неплохо бы глянуть на код.
myFile = SD.open("asd.txt"); if (myFile) { myFile.seek(pos); while (myFile.available()) { Serial.write(myFile.read()); } myFile.close(); }да какой там секретный
просто в данном случае (в моей ситуации ) код не причём.
я не нашёл в библиотеке как ограничить количество читаемых байт
Вы так в этом уверены? Ну, если Вы уже сами знаете что при чём, а что ни при чём, зачем вопросы задавать?
Знаете. я ни разу не видел водопада Виктория, но это не значит, что его не существует.
Теперь по сути дела. Вариантов, как всегда, 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 (если Вы не знаете сколько именно байтов Вам надо читать, а хотите читать пока не встретите какой-то признак по которому следует прекратить чтение)
Просто читаете как у Вас по ходу проверяя, что именно прочитали. Как встретился ограничивающий символ - прекращаете читать.
спасибо
попробую
о результатах отпишусь
сделал на варианте 1.2
ЕвгенийП - спасибо!
Не за что
здравствуйте.
помогите разобраться. Прочитал описание функций работы с 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); }Так вот
выводит в монитор порта следующее:
4294967295 - это "-1".
судя по всему, команда seek() возвращает ошибку, ну и дальше ничего на самом деле не работает.
Посмотрите внимательно - у вас в коде переменная myFile нигде не инициализируется. откуда контроллер должен понять, что myFile - это именно config.txt ?
1. Если не понимаете, почему кубики, для начала выведите эти байты не как символы, а как числа. Думаю, что числа окажутся 255 из-за попытки чтения за пределами конца файла.
2. Вы нигде не проверяете, открылся ли файл, успешно ли завершилась попытка позиционирования... Отслеживайте ошибки и будете знать, что происходит в программе.
Спасибо.
Не предал этому значения.
Поменял
SD.open("CONFIG.TXT", FILE_READ);
на
myFile = SD.open("CONFIG.TXT", FILE_READ);
и всё заработало.