Сохранение файла .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-карты
- Проблемы с чтением растровых изображений с SD-карты
- SD-карта не инициализируется
- Что означают эти контакты? Куда мне их подключить?
- Режимы открытия файлов на SD-карте Arduino добавление/перезапись
- Понимание того, почему следует избегать «String» и альтернативных решений
Примечание: сделайте себе и своим читателям одолжение и правильно отформатируйте код, используя функции Arduino IDE ([учебник здесь](https://www.baldengineer.com/one-click-clean-arduino-code.html) ) или какой-нибудь онлайн-улучшитель. Так будет намного проще обнаружить ошибки., @Maximilian Gerhardt