Сохранение файла .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()
 {

  } 

, 👍0

Обсуждение

Примечание: сделайте себе и своим читателям одолжение и правильно отформатируйте код, используя функции Arduino IDE ([учебник здесь](https://www.baldengineer.com/one-click-clean-arduino-code.html) ) или какой-нибудь онлайн-улучшитель. Так будет намного проще обнаружить ошибки., @Maximilian Gerhardt


1 ответ


Лучший ответ:

0

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