Сохранение и чтение массива float с карты памяти
- Войдите на сайт для отправки комментариев
Ср, 20/05/2015 - 21:19
Здравствуйте. Сделал по приведенному на форуме примеру чтение-запись массива
В результате пишет он туда скорее всего только "целое" как быть. Вот код, возможно я что то делаю неверно, поправьте, пожалуйста.
#include <SPI.h>
#include <SD.h>
float ValveClock[4] = {0.75, 1.0, 0.9, 3.4};
byte i,j,l;
File MyFile;
void setup() {
Serial.begin(9600);
while (!Serial);
if (!SD.begin(53)) {
Serial.println("initialization failed!");
return;
}
SaveConfig();
LoadConfig();
}
void loop() {
}
void SaveConfig() {
int tmp=1;
byte j, l;
if (SD.exists("config.ok")) {
SD.remove("config.ok");
}
if (SD.exists("config.ini")) {
SD.remove("config.ini");
}
MyFile = SD.open("config.ini", FILE_WRITE);
if (MyFile) {
for (j=0;j<4;j++) {
MyFile.write(ValveClock[j]);
Serial.print(j);
Serial.print(" ");
Serial.print(ValveClock[j]);
Serial.print(" || ");
}
Serial.println(" ");
MyFile.close();
MyFile = SD.open("config.ok", FILE_WRITE);
MyFile.write("ok");
Serial.println(" OK FILE ");
MyFile.close();
}
}
void LoadConfig() {
Serial.println(" read config");
if (SD.exists("config.ok")) {
Serial.println(" file ok");
if (SD.exists("config.ini")) {
Serial.println(" config ok");
MyFile = SD.open("config.ini", FILE_READ);
Serial.println(" VClock ");
for (j=0;j<4;j++) {
ValveClock[j]=MyFile.read();
Serial.print(j);
Serial.print(" ");
Serial.print(ValveClock[j]);
Serial.print(" || ");
}
Serial.println(" ");
Serial.println(" Sednsors ");
MyFile.close();
}
}
}
сам дошел
Описание
Записывает данные в файл.
Синтаксис
file.write(data)file.write(buf, len)Параметры
file: экземпляр класса File (возвращаемый функцией SD.open())
data: записываемый байт данных (byte), символ (char) или строка (char *)
buf: массив символов или байт
len: количество элементов массива
Хотя, подскажите, как мне правильно считывать байты и преобразовывать их во флоат. Пока что это выглядит вот так:
//преобразует float (хххх.хххх) в массив из 9 байт, где последний байт 1, если число отрицательное //и записывает его в открытый для ззаписи переданный файл void writeFloat2File(File File2Write, float Value) { byte j; byte Data[9]; float div=1000; float tmp; Data[8]=0; if (Value<0) { Data[8]=1; Value*=-1.0; } for (j=0;j<4;j++) { tmp=Value/div; Data[j]=0; if (tmp>1) { Data[j]=(byte)(tmp); Value-=(int)tmp*div; } div/=10; } Value*=10000; div=1000; for (j=4;j<8;j++) { tmp=Value/div; Data[j]=0; if (tmp>1) { Data[j]=(byte)(tmp); Value-=(int)tmp*div; } div/=10; } File2Write.write(Data,9); } //читаем массив байт из файла и делает обратное преобразование следующего действия //преобразует float (хххх.хххх) в массив из 9 байт, где последний байт 1, если число отрицательное float readFloat4mFile(File File2Read) { byte j; byte tmp; float div=1000.0; float Ret=0; for (j=0;j<8;j++) { tmp=File2Read.read(); Ret+=tmp*div; div/=10; } tmp=File2Read.read(); if (tmp=1) Ret*=-1; return Ret; }Матиас Сракоши, когда же перестанет паскаль сквозить в коде???
час с кодом насильничали!
Пишите if(1 ==tmp) будет чуть полегче
проблема в том, что я забываю про второе равенство :-)
Так я про это и говорю, это для этого пишется сначала константа, потом переменная и присвоение константе словит компилятор, выдаст ошибку.
ОУ, Вы Гуру!!! теперь буду привыкать к этому :-)
К сожалению сейчас вряд ли найду, есть рекомендации по приемам программирования, которые я где то читал, оттуда это и осталось. Так что это я не сам придумал :)