INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 0 Bewertungen - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
große 2-dim float-Arrays schnell auf SD speichern und zurücklesen?
02.06.2015, 08:45
Beitrag #17
RE: große 2-dim float-Arrays schnell auf SD speichern und zurücklesen?
und wie genau würdest du dann
1.) schreiben und
2.) wieder zurück-lesen
?

(Anm.: als erstes müssten später dann die beiden Index-Grenzen als Integer stehen, damit keine Verwechslungen mit alten unpassenden File-Versionen stehen.
Bei meiner Versionen würde ich die einfach per fprintf als allererstes schreiben/lesen, und dann die verschachtelte for-Schleifen für die Arrays selber)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
02.06.2015, 10:24
Beitrag #18
RE: große 2-dim float-Arrays schnell auf SD speichern und zurücklesen?
(02.06.2015 08:45)HaWe schrieb:  und wie genau würdest du dann
1.) schreiben und
In etwa so:
Code:
stream->write(&(farray[i][j]), sizeof(float));
Zitat:2.) wieder zurück-lesen
Das könnte so gehen:
Code:
byte* ptr = &(farray[i][j]);
for(int b = 0; b < sizeof(float); b++)
   ptr[b] = stream->read();
Etwas eleganter geht das vielleicht mit eigenen Funktionen, aber Du kannst das obige auch gleich für das ganze Array machen, ohne die for-Schleifen über i und j:
Zitat:1.) schreiben und
In etwa so:
Code:
stream->write(farray, sizeof(float) * zeilen * spalten);
Dabei weiss ich allerdings nicht genau wo die Grenzen für den zweiten Parameter liegen. Wenn Du 100 Zeilen und 20 Spalten hast ist das kein Problem, aber vielleicht bei 100x100. Dann vielleicht besser Byte für Byte wie beim Lesen. Vielleicht hat aber auf dem Due ein int schon 32 Bit, dann ists auch wieder kein Problem.
Zitat:2.) wieder zurück-lesen
Das könnte so gehen:
Code:
byte* ptr = farray;  
for(long b = 0; b < (long)(sizeof(float)) * zeilen * spalten; b++)
   ptr[b] = stream->read();

Zitat:(Anm.: als erstes müssten später dann die beiden Index-Grenzen als Integer stehen, damit keine Verwechslungen mit alten unpassenden File-Versionen stehen.
Die kannst Du im Prinzip auch direkt Binär schreiben. Einfach in meinem ersten Beispiel jeweils float durch int ersetzen.
(Alles ohne Gewähr. Ich habe das einfach so runtergetippt ohne irgend etwas davon auszuprobieren.)
Gruß,
Thorsten

Falls ich mit einer Antwort helfen konnte, wuerde ich mich freuen, ein paar Fotos oder auch ein kleines Filmchen des zugehoerigen Projekts zu sehen.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
02.06.2015, 14:33
Beitrag #19
RE: große 2-dim float-Arrays schnell auf SD speichern und zurücklesen?
aah, danke, da sind sie ja wieder, die Byte-Pointer Big Grin
Super, schaut gut aus! Probiere ich aus! Dankeschön!
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
21.06.2015, 09:26 (Dieser Beitrag wurde zuletzt bearbeitet: 21.06.2015 10:17 von HaWe.)
Beitrag #20
RE: große 2-dim float-Arrays schnell auf SD speichern und zurücklesen?
hallo,
habe jetzt viel herumprobiert, der jetzige Stand ist:
1.) es ist leider erforderlich, in einer lesbaren Form zu speichern, damit man später das File auch auf dem PC betrachten, kontrollieren und verändern kann (d.h. int und float Zahlen als strings wie mit fprintf)

2.) fprintf schreibt alle Daten einwandfrei korrekt:
- erst einen Header mit int-Zahlen als Informationen über die Größe und Struktur der folgenden Daten (insb. Array-Dimensionen). Dies sind zur Zeit die folgenden:
108 20 20 20 60 4 -1
dann ein Line feed '\n'

- dann die Float-Daten selber (in der Testphase 4x 108, zwischen den 108er Zeilen ebenfalls ein Linefeed '\n')

- Am Schluss ein zusätzliches '\0'.

wie gesagt, sie erscheinen einwandfrei in dieser Form auf der SD, wenn man sie auf dem PC im SD-Laufwerk kontrolliert.

Nur: mit fscanf_ gelesen werden die Ints im Header zwar korrekt gelesen, die floats aber werden entstellt, aus Nullen werden teilweise Einsen und umgekehrt, auch die Struktur stimmt nicht mehr.
Ich habe alles mit IDE 1.6.1, 1.6.3 und 1.6.5 probiert, keine Verbesserung.


Frage:
Wie kann man besser und sicherer Ints und Floats als Strings aus einer Datei einlesen und wieder richtig in ints und Floats zurück-konvertieren?
z.B. durch eine Art fileReadInt oder eine fileReadFloat-Funktion?




hier sind die bisher benutzen Funktionen:
Code:
int32_t  fscanf_ ( File * stream, const char fmtstr[], ... ) {
   const  int32_t   MAXSTRSIZE = 1024;
   char   str[MAXSTRSIZE];
   va_list   args;
   int32_t   i=0, cnt=0;
   int16_t   chr;

   va_start(args, fmtstr);

   strcpy(str, "");
   while ( (stream->available()) && (i < MAXSTRSIZE-1) ) {  
      chr = stream->read() ;
      if (chr>=0 && chr!='\n') {
           str[i]=(char)chr;    
           ++i;
      }
      else break;    
   }

   str[++i] = '\0';
                                                        
   cnt = vsscanf( str, fmtstr, args );
   va_end(args);

   return cnt;
}


//********************************************************************************​?***********

int32_t fprintf_ ( File * stream, const char fmtstr[], ... ) {
   char      str[1024];
   va_list   args;
   int32_t   num;
  
   va_start( args, fmtstr );
   num = vsnprintf(str, sizeof(str), fmtstr, args);
   stream->print(str);
   va_end( args );

   return num;
}

//********************************************************************************​***********

so sehen die geschriebenen Daten aus :
erst der Int-Header
108 20 20 20 60 4 -1 (korrekt geschrieben und auch später sogar korrekt gelesen !!)
dann die je 108 Elemente langen float-Reihen, beginnend mit
0 0
0 1
1 0
1 1

gelesen werden hinterher aber von scanf_ als Floats nur
0 0
0 0
0 0
0 0
und Einsen kommen irgendwo anders vor, obwohl die Lese-Reihenfolge schrittweise Stück für Stück einzeln erfolgt.

ps,
dies ist die Schreib-Routine:
Code:
fprintf_(&myFile, "%d %d %d %d %d %d %d\n", NMAXIN,NMAXHID,NMAXOUT,NMAXCONT,NMAXPAT,NumPattern, NNCHK);

for( p = 1 ; p <= NumPattern ; ++p ) {
        for( i = 1 ; i <= NMAXIN ; ++i ) {
           fprintf_(&myFile, " %f", Input[p][i]);            
           ++cnt;
        }
        for( o = 1 ; o <= NMAXOUT; ++o ) {
           fprintf_(&myFile, " %f", Target[p][o]);            
           ++cnt;            
        }  
        Serial.println();
        fprintf_(&myFile, "\n");
                
    }
    fprintf_(&myFile, "\0");

und dies die Lese-Routine (nur zum Betrachten):
Code:
fscanf_(&myFile, "%d %d %d %d %d %d %d", &maxin,&maxhid,&maxout,&maxcont,&maxpat,&numpat, &chk);

for( p = 1 ; p <= NumPattern ; ++p ) {              
            for( i = 1 ; i <= NMAXIN ; ++i ) {
                   fscanf_(&myFile, "%f", &fval);  
                   Serial.print(fval); Serial.print("   ");  
                   ++cnt;
            }
            for( o = 1 ; o <= NMAXOUT; ++o ) {
                   fscanf_(&myFile, "%f", &fval);  
                   Serial.print(fval); Serial.print("    ");  
                   ++cnt;  
            }
            Serial.println();
        }

        myFile.close();


Angehängte Datei(en)
.zip  JONETDAT.zip (Größe: 205 Bytes / Downloads: 9)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
21.06.2015, 20:18
Beitrag #21
RE: große 2-dim float-Arrays schnell auf SD speichern und zurücklesen?
Hi,
hast du mal daran gedacht deine Daten im .csv Format zu speichern bzw. an das anzulehnen ? Hier mal ein Beispiel wie ich bei nem Datenloggersketch die Daten auf die SD geschrieben habe:
Code:
1367803560,24.8,23.6,26.7, 278,1023
    1367803570,24.8,24.2,27.4, 283,1023
    1367803580,24.2,23.6,26.7, 298,1021
    1367803590,24.2,23.6,26.7, 283,1023
    1367803600,24.2,23.6,27.4, 303,1023
    1367803610,24.8,23.6,26.7, 288,1023
..das erste Feld beginnt mit Leerzeichen bis die Zeit in Millis kommt, dann das Komma als Feldtrenner und dann 3 Temperaturen mit Dezimalpunkt und 1 Nachkommastelle, dann noch Zwei Integerwerte die so aus dem ADC kommen.
Tipp, schau mal was dein Tabellenkalkulationsprogramm als Feldtrenner beim importieren von csv Dateien anbietet....danach kannst dich ja richten.
Und wenn deine Daten nach diesem Format vorliegen sollte es auch kein Problem sein die so wieder auszulesen indem einfach ein Wert gelesen wird bis ein Feldtrenner erkannt wird. Zusätzlich kannst ja ein Tag noch einführen z.B. "#" um Header und Daten zu trennen...falls notwendig.
lg
bk

1+1 = 10 Angel ...und ich bin hier nicht der Suchmaschinen-Ersatz Dodgy...nur mal so als genereller Tipp..
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
22.06.2015, 08:25 (Dieser Beitrag wurde zuletzt bearbeitet: 22.06.2015 08:38 von HaWe.)
Beitrag #22
RE: große 2-dim float-Arrays schnell auf SD speichern und zurücklesen?
wie lese ich denn csv-formatierte Daten von SD zurück ins laufende Arduino-Sketch-Programm ein? Wie soll das gehen?
Mit speziellen Feldtrennern zu schreiben ist überhaupt kein Problem (Leerzeichen oder Komma oder Semikolon oder Doppelkreuz) - das Zurücklesen der 400 - 5000 Floats ins Arduino-Programm scheitert bislang!

Der Arduino soll in die Lage versetzt werden
1.) den aktuellen Datenbestand aus dem Variablen-RAM auf SD zu speichern, und dann
2.) ältere Daten (7 Ints und dann ein paar tausend Floats) aus dem SD-Datenbestand zurück in sein Variablen-RAM einzulesen.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
22.06.2015, 08:38
Beitrag #23
RE: große 2-dim float-Arrays schnell auf SD speichern und zurücklesen?
Hi,
Du schreibst immer mehrere floats in eine Zeile, aber beim Lesen erwartest Du immer ein float pro Zeile. Ich glaube, dass das mit Deinen Funktionen nicht geht.
Gruß,
Thorsten

Falls ich mit einer Antwort helfen konnte, wuerde ich mich freuen, ein paar Fotos oder auch ein kleines Filmchen des zugehoerigen Projekts zu sehen.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
22.06.2015, 08:46 (Dieser Beitrag wurde zuletzt bearbeitet: 22.06.2015 09:02 von HaWe.)
Beitrag #24
RE: große 2-dim float-Arrays schnell auf SD speichern und zurücklesen?
edit: Moment, ich teste noch was...
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  Fehler beim Speichern von Projekten Manni66 16 691 23.08.2016 10:05
Letzter Beitrag: hotsystems
  Gewichteten Durchschnitt berechnen, 20 Werte in fortlaufender Variable speichern TimeMen 10 477 03.07.2016 09:00
Letzter Beitrag: Binatone
  String in EEPROM Speichern BennIY 2 417 27.06.2016 10:23
Letzter Beitrag: BennIY
  Messwerte in Array speichern ArduinoMega2560 2 421 07.06.2016 16:30
Letzter Beitrag: SkobyMobil
  Rechnen mit float und unsigned long Rudi 3 306 03.06.2016 12:41
Letzter Beitrag: hotsystems
  Sensordaten in MYSQL speichern rieders 3 700 02.03.2016 19:58
Letzter Beitrag: rieders
  float in eeprom goldfisch 4 673 28.12.2015 18:54
Letzter Beitrag: Bitklopfer
  Float über I2C zwischen 2 Arduinos UNO Marduino_UNO 9 1.625 19.10.2015 09:09
Letzter Beitrag: Retian
  Umrechnung float Geodaten in Grad'Min'Sec.secfrac HaWe 0 607 04.10.2015 11:42
Letzter Beitrag: HaWe
  Ergebnis lässt sich nicht speichern? schuballaa 2 625 30.08.2015 17:07
Letzter Beitrag: hotsystems

Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste