Сохранение и чтение массива float с карты памяти

gooroong
gooroong аватар
Offline
Зарегистрирован: 08.03.2015

Здравствуйте. Сделал по приведенному на форуме примеру чтение-запись массива

В результате пишет он туда скорее всего только "целое" как быть. Вот код, возможно я что то делаю неверно, поправьте, пожалуйста.

#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();
    }
  } 
}

 

gooroong
gooroong аватар
Offline
Зарегистрирован: 08.03.2015

сам дошел

Описание

Записывает данные в файл.

Синтаксис

?
file.write(data)
file.write(buf, len)

Параметры

file: экземпляр класса File (возвращаемый функцией SD.open())

data: записываемый байт данных (byte), символ (char) или строка (char *)

buf: массив символов или байт

len: количество элементов массива

gooroong
gooroong аватар
Offline
Зарегистрирован: 08.03.2015

Хотя, подскажите, как мне правильно считывать байты и преобразовывать их во флоат. Пока что это выглядит вот так:

//преобразует 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;
}

 

gooroong
gooroong аватар
Offline
Зарегистрирован: 08.03.2015

Матиас Сракоши, когда же перестанет паскаль сквозить в коде???

if (tmp=1) Ret*=-1;

час с кодом насильничали!

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

Пишите if(1 ==tmp) будет чуть полегче

gooroong
gooroong аватар
Offline
Зарегистрирован: 08.03.2015

проблема в том, что я забываю про второе равенство :-)

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

Так я про это и говорю, это для этого пишется сначала константа, потом переменная и присвоение константе словит компилятор, выдаст ошибку.

gooroong
gooroong аватар
Offline
Зарегистрирован: 08.03.2015

ОУ, Вы Гуру!!! теперь буду привыкать к этому :-)

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

К сожалению сейчас вряд ли найду, есть рекомендации по приемам программирования, которые я где то читал, оттуда это и осталось. Так что это я не сам придумал :)