Сохранение файла .txt на SD-карту и чтение данных каждого содержимого в файл txt, а затем сохранение его в переменной
Я новичок в arduino Я пытаюсь создать проект arduino, который сохраняет файл .txt на SD-карту и читает файл txt, а затем сохраняет его в переменной типа данных «Long» с именем «savednum». Я успешно смог сохранить текстовый файл и прочитать его, однако проблема заключается в сохранении прочитанного текстового файла, когда я прочитал текстовый файл и сохранил его в сохраненном номере, а затем последовательно распечатал сохраненный номер, он дает разные/случайные числа, которые не равны данные в .txtfile, которые я храню и читаю. Мне интересно, что кажется неправильным? Любое предложение действительно ценится. Заранее благодарю.
#include <TMRpcm.h>
#include <SD.h>
#include <SPI.h>
#define SD_ChipSelectPin 4 //используя цифровой контакт 4 на arduino nano 328
TMRpcm tmrpcm; // создаем объект для использования в этом скетче
File myFile;
char serialData;
int i = 0;
long n1 = 123456789;
long n2 = 245678918;
long savednum =0;
void setup()
{
Serial.begin(9600);
while (!Serial) {
}
Serial.print("Initializing SD card...");
if (!SD.begin(SD_ChipSelectPin)) {
Serial.println("initialization failed!");
while (1);
}
Serial.println("initialization done.");
myFile = SD.open("NEWDATA.txt", FILE_WRITE);
if (myFile) {
Serial.print("Writing to NEWDATA.txt...");
myFile.println(n1);
myFile.println(n2);
myFile.close();
Serial.println("done.");
} else {
Serial.println("error opening NEWDATA.txt");
}
myFile = SD.open("NEWDATA.txt");
if (myFile) {
Serial.println("NEWDATA.txt:");
while (myFile.available()) {
Serial.write(myFile.read());
// здесь код, который я пытался прочитать .txt файл и сохранить его в длинном
savednum = myFile.read();
Serial.println(savednum);
}
myFile.close();
}
}
void loop()
{
}
@Megumichan, 👍0
Обсуждение1 ответ
Лучший ответ:
myFile.read() считывает из файла только один байт, а не весь файл и даже не целую строку.
Вы читаете один байт, а затем печатаете его. Затем чтение второго байта, сохранение его в переменной, а затем печать переменной. Затем вы снова возвращаетесь к началу.
Итак, вы печатаете альтернативные «нечетные» байты и сохраняете/переписываете переменную «четными» байтами. Так что у вас просто ерунда.
Вы сохраняете данные в файле в виде текста ASCII, поэтому необходимо полностью прочитать каждую строку, а затем преобразовать эту строку символов в число. Или читайте каждый символ по очереди и манипулируйте общим значением строки.
Например:
long savedNum = 0;
long numberOne = 0;
while (myFile.available()) { // Что-то осталось прочитать
char c = myFile.read(); // Получить следующий символ
if (isdigit(c)) { // Это число 0-9
savedNum *= 10; // Освобождаем место десятичным сдвигом влево
savedNum += (c - '0'); // Преобразование символа в число и добавление его к сумме
} else if (c == '\n') { // Конец строки
Serial.print(F("The number is: "));
Serial.println(savedNum); // Покажите нам номер
numberOne = savedNum; // Сохраните его в другом месте — улучшите его для нескольких номеров.
savedNum = 0; // Сброс в 0 готов к чтению следующей строки
}
}
API Arduino (класс Stream) также включает несколько полезных вспомогательных функций, таких как:
int num = myFile.parseInt(); // получаем следующее целое
Не существует parseLong(), но, несмотря на свое название, parseInt() фактически возвращает long. Это считывает символы до тех пор, пока не получит нечисловой символ, и преобразует их в long, используя тот же метод, что и в моем примере. Однако он не различает строки, поэтому его можно использовать для получения отдельных чисел в одной строке, например 32847,2345534,12,-43.
В вашем файле вам, возможно, придется отфильтровать лишний \r, который может быть там, из концов строк, иначе вы получите пропущенные числа.
Привет, большое спасибо за ваш ответ, он действительно мне очень помог, теперь я успешно сохраняю данные из файла .txt в переменную, однако у меня есть последний вопрос, потому что здесь я сохранил 18 символов в файле txt, я хотел, чтобы он был разделен на 9 символы, а затем распределяют их по двум длинным переменным типа данных с именами Storenum1 и storenum2. Возможно ли это? Надеюсь, вы можете мне помочь. Я очень благодарен за вашу помощь., @Megumichan
Вы не сохраняете 18 символов. Вы сохраняете 2 строки до 9 символов каждая плюс окончания строк (потому что вы написали с помощью println). Таким образом, вы получаете две строки в вашем файле nnnnnnnn\r\n. Мой пример будет читать каждую строку по очереди — вам решать, что делать со значением savedNum для каждой строки., @Majenko
Спасибо, теперь я понимаю, большое спасибо за хорошее объяснение и ответ. Я пытался изучить, как хранить две переменные. Я очень ценю вашу помощь, спасибо, @Megumichan
Является ли этот метод таким же, как использование EEPROM?, @R1S8K
@ R1S8K Нет. EEPROM читает и записывает отдельные байты в ячейки памяти. SD-карта работает с файлами и потоками данных., @Majenko
Я работаю с lcd128x64, я застрял в эти дни в разработке самой важной функции для установки одного пикселя и того, как работать с буферами. SD-карта была бы идеальным решением для загрузки изображений. Мне интересно, как лучше всего разработать хороший графический интерфейс в lcd128x64? Лучше ли загружать изображения графического интерфейса вместо рисования каждого элемента? В любом случае, я мог бы открыть новую тему о разработке идеальной функции набора пикселей., @R1S8K
Все зависит от того, какой именно дисплей. Я потратил много времени на написание драйверов для ЖК-дисплеев и TFT-дисплеев и знаю, что для большинства дисплеев GLCD гораздо лучше, если у вас есть доступная память для создания внутреннего буфера для хранения текущего изображения и массового обновления его частей., @Majenko
- Проблема с открытием нескольких текстовых файлов одновременно/по порядку с использованием <SD.h>
- DFPlayer для записи на SD-карту
- Попытка прочитать случайную строку с SD-карты
- Переменные Arduino, загруженные с SD-карты
- Проблемы с чтением растровых изображений с SD-карты
- SD-карта не инициализируется
- Что означают эти контакты? Куда мне их подключить?
- Режимы открытия файлов на SD-карте Arduino добавление/перезапись
Примечание: сделайте себе и своим читателям одолжение и правильно отформатируйте код, используя функции Arduino IDE ([учебник здесь](https://www.baldengineer.com/one-click-clean-arduino-code.html) ) или какой-нибудь онлайн-улучшитель. Так будет намного проще обнаружить ошибки., @Maximilian Gerhardt