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
Daten von File auf SD Card (formatiert) schreiben+lesen u.a.m.
15.02.2015, 23:01 (Dieser Beitrag wurde zuletzt bearbeitet: 15.02.2015 23:02 von HaWe.)
Beitrag #9
RE: Daten von File auf SD Card (formatiert) schreiben+lesen u.a.m.
ich verzweifle.
selbst wenn ich einsetze nach

if(sdata[i] == '\n') { // end of string: CR
sdata[i] = '\0'; // Null-Terminierung ?

gibt es nur Mist.

Wie kann ich den gelesenen String nur in Integer zurückkonvertieren?
mit
atoi() geht es nicht,
und mit scanf(sdata, "%d", &p) geht es auch nicht. Angry

Mit atof() und float-Werten scheint es aber doch auch zu gehen!
was mache ich nur falsch ??? Huh ???
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
16.02.2015, 00:16 (Dieser Beitrag wurde zuletzt bearbeitet: 16.02.2015 00:20 von Bitklopfer.)
Beitrag #10
RE: Daten von File auf SD Card (formatiert) schreiben+lesen u.a.m.
(15.02.2015 23:01)HaWe schrieb:  ich verzweifle.
selbst wenn ich einsetze nach

if(sdata[i] == '\n') { // end of string: CR
sdata[i] = '\0'; // Null-Terminierung ?

gibt es nur Mist.

Wie kann ich den gelesenen String nur in Integer zurückkonvertieren?
mit
atoi() geht es nicht,
und mit scanf(sdata, "%d", &p) geht es auch nicht. Angry

Mit atof() und float-Werten scheint es aber doch auch zu gehen!
was mache ich nur falsch ??? Huh ???

Hi,
wie hast du deine Daten auf dem File organisiert ? Hast dich da an das csv Format gehalten das z.B. so aussieht:

1367827560,23.6,22.9,25.5, 259,1023
1367827570,23.6,22.9,25.5, 268,1023
1367827580,23.6,22.9,25.5, 263,1023
1367827590,23.6,22.9,24.8, 263,1023

Wie du siehst sind die Kommas der Feldtrenner. Damit kann man die Daten auch wieder separieren.
Und so wird eine Ausgabezeile vor dem schreiben auf SD zusammengesetzt:
//##### Ausgabestring fuer Serial und SD zusammensetzen
String sdausgstr = "";
sdausgstr = sdausgstr + lcdausg1 + "," + kty1str + "," + kty2str + "," + kty3str + "," + photostr + "," + tstr;

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
16.02.2015, 08:45
Beitrag #11
RE: Daten von File auf SD Card (formatiert) schreiben+lesen u.a.m.
hallo,
danke für deinen Hinweis!
Zu deiner Frage:
Ich habe die Daten bisher genau so geschrieben, wie man sie mit C und stdio.h schreiben würde, d.h. per fprintf() bzw. sprintf() formatiert und so in die Dazei geschrieben.

Was ein Blödsinn, dass es keine vernünftigen stdio.h Filefunktionen für Arduino gibt, obwohl es sich "C" schimpft!

Wie schreibe ich denn nun meine Gruppen von 2 integer und 2 floats
p=1 q=2 x=PI y=987.654
p=2 q=4 x=4.22 y= 2.345
p=3 q=6 x=8.44 y=3.456
und anschließend noch weitere 4er-Gruppen in das File?

wie formatiere ich sie (per sprintf(sdata,...)? welcher formatstring?)

wie schreibe ich sie (mit myFile.println(sdata) ??)

wie lese ich sie anschließend guppenweise als 2x INT und 2x FLOATwieder zurück?
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
16.02.2015, 08:55
Beitrag #12
RE: Daten von File auf SD Card (formatiert) schreiben+lesen u.a.m.
Die Frage von Bitklopfer
Zitat:wie hast du deine Daten auf dem File organisiert ?
scheint mir sehr sehr sinnvollExclamation
Ich würde nach dem Schreiben auf die SD Karte erstmal mit externem (Hex?)-Editor gucken was dann wirklich in der Datei drin steht.
Habe so meine Zweifel, dass da wirklich drin ist was du erwartest. Die Ausgabe mit print zur Kontrolle ist da manchmal nicht ausreichend Huh
Grüße RK

Nüchtern betrachtet...ist besoffen besser Big Grin
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
16.02.2015, 09:07 (Dieser Beitrag wurde zuletzt bearbeitet: 16.02.2015 09:23 von HaWe.)
Beitrag #13
RE: Daten von File auf SD Card (formatiert) schreiben+lesen u.a.m.
also nein - das muss doch hoffentlich nicht wirklich sein!!
es gibt als SD-File Funktionen
println
und
read
(Peinlich genug, dass es dann nicht wenigstens auch ein readln gibt.)

und es muss doch möglich sein, mit diesen beiden lächerlichen Funktionen Ints und Floats ins File schreiben und wieder lesen und umwandeln zu können, ohne jetzt hier mit Hexeditoren rumhampeln zu müssen!

Außerdem siehst du ja, dass die Daten, die mit sprintf formatiert und dann mit println geschrieben wurden, als STRING auch wieder korrekt gelesen wurden.

Code:
#: reading test.txt
1: 1                     // 1. Wert: integer = 1 als String

2: 2                     // 2. Wert: integer = 2 als String

3: 3.141593              // 3. Wert: float = PI  als String

4: 987.654000            // 4. Wert: float = 987.654  als String

#: test.txt closed.





Jetzt geht es also nur ums Umwandeln des Strings zurück in Zahlen, und in C verwendet man dazu die Funktionen
scanf oder atoi und atof.

atof funktioniert ja sogar, wie du siehst,
Code:
#: reading test.txt

3: 3.141593              // 3. Wert: float = PI  als String
3.14                          // als Float-Zahl

4: 987.654000            // 4. Wert: float = 987.654  als String
987.65                        // als Float-Zahl

#: test.txt closed.



aber atoi funktioniert nicht !!!
da stehen zwar die beiden ints als letzte Ziffern am Schluss, aber davor steht irgend ein Blödsinn:
Code:
#: reading test.txt
1: 1                     // 1. Wert: integer = 1 als String
.6540001                      // als Integer-Zahl !!!!!!!FALSCH !!!!!!!
2: 2                     // 2. Wert: integer = 2 als String
.6540002                      // als Integer-Zahl !!!!!!!FALSCH !!!!!!!

#: test.txt closed.


Also nochmal zu Bitklopfers Anregung:

Wie schreibe ich denn nun meine Gruppen von 2 integer und 2 floats
p=1 q=2 x=PI y=987.654
p=2 q=4 x=4.22 y= 2.345
p=3 q=6 x=8.44 y=3.456
und anschließend noch weitere 4er-Gruppen in das File?

wie formatiere ich sie (per sprintf(sdata,...)? welcher formatstring?), um möglichst keine Dezimalstellen bei floats zu verlieren,
und dann einfach hintereinander in einen gemeinsamen langen String, jeweils getrennt durch Kommta?

(BTW: ich verwende eigtl. keine String-Klasse, ich verwende normalerweise nur char * sbuf[] )

wie schreibe ich sie (mit myFile.println(sdata) ??) und dadurch mit einem '\n' am Schluss der Zeile?

und ganz besonders wichtig:
wie lese ich sie anschließend guppenweise als 2x INT und 2x FLOATwieder zurück?
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
16.02.2015, 09:20 (Dieser Beitrag wurde zuletzt bearbeitet: 16.02.2015 09:22 von rkuehle.)
Beitrag #14
RE: Daten von File auf SD Card (formatiert) schreiben+lesen u.a.m.
Ich hänge mich jetzt mal ganz weit aus dem Fenster Smile und vergleiche deine Ausgaben im letzten Post auf der 1. Seite:
Zitat:1: 1 // 1. Wert: integer = 1 als String
.6540001 // als Integer-Zahl !!!!!!!FALSCH !!!!!!!
2: 2 // 2. Wert: integer = 2 als String
.6540002 // als Integer-Zahl !!!!!!!FALSCH !!!!!!!
mit diesen Angaben:
Zitat:p=1 q=2 x=PI y=987.654
Von daher würde ich mal sagen, dass atoi() schon funktioniert (warum auch nicht?), aber entweder der Offset in der Datei nicht beachtet/gesetzt wird oder eben der "." einiges durcheinander bringt.
RK
PS: Womit wir irgendwie wieder beim Thema Feldbegrenzer bzw. "entschärfen" von Sonderzeichen landen.

Nüchtern betrachtet...ist besoffen besser Big Grin
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
16.02.2015, 09:48
Beitrag #15
RE: Daten von File auf SD Card (formatiert) schreiben+lesen u.a.m.
Hi,
hast Du nicht auch eine gepatchte libc? Vielleicht ist da irgendwas faul.
Des weiteren wundere ich mich ein bisschen, dass ohne die Null am Ende der Strings überhaupt was einigermaßen sinnvolles rauskommt.
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
16.02.2015, 09:50 (Dieser Beitrag wurde zuletzt bearbeitet: 16.02.2015 15:36 von HaWe.)
Beitrag #16
RE: Daten von File auf SD Card (formatiert) schreiben+lesen u.a.m.
ja, es stimmt: bisher hatte ich keine Feldbegrenzer verwendet, ich habe ja die Standardfunktion sprintf von C verwendet und jede Zahl einzeln per myFile.println
in die Datei geschrieben.

geschrieben wurde die 1 als string "1"
gelesen wurde sie auch wieder als string "1" (byteweise, bis zum Auftreten eines '\n'),
nur dann konnte dieser gelesene String "1" mit scanf() oder atoi() nicht wieder in die Zahll 1 zurückverwandelt werden,
auch nicht, wenn man das '\n' am Schluss nach C-Standard durch den Stringbegrenzer '\0' ersetzt.
Auch kommt ja nach der 1 erstmal die 2,
dazwischen kommt das '\n', und da unterbricht er erstmal das Lesen,
also hat er den String mit der 2 ja noch gar nicht gelesen,
erst recht kennt er noch keine Floats dahinter,
trotzdem wandelt er "1" in irgendeinen Müll um mit der 1 dann am Schluss.



Irgendwas läuft schief mit dem lesen, das ist klar, allerdings kann println ja nun mal Zahlenstrings nur Zeilenweise mit '\n' am Schluss schreiben.
Da ein '\n' am Schluss ist, ist natürlich dann auch kein Komma nötig gewesen.

Aber sag mir dann doch einfach mal bitte im Klartext (Sourcecode), wie ich stattdessen die genannten Daten schreiben und wieder lesen und zurückverwandeln soll, wenn es schon keine Sketch-Funktionen gibt (wie in stdio.h), die das C-Standard-mäßig erledigen...

die Daten lauten:

p=1 q=2 x=3.141593 y=987.654
p=2 q=4 x=4.22 y= 2.345
p=3 q=6 x=8.44 y=3.456
und anschließend noch weitere 4er-Gruppen ...

wie formatiere ich sie (per sprintf(sdata,...)? welcher formatstring?), um möglichst keine Dezimalstellen bei floats zu verlieren,
und dann einfach hintereinander in einen gemeinsamen langen String, jeweils getrennt durch Kommta?

(BTW: ich verwende eigtl. keine String-Klasse, ich verwende normalerweise nur char * sbuf[] )

Die Daten in der Datei insgesamt können durchaus 80MB groß werden.
wie schreibe ich sie (einzeln oder gruppenweise mit myFile.println(sdata) ? und dadurch mit einem '\n' am Schluss der Zeile?
Oder sogar alle fortlaufend, durch Kommata getrennt, in einen Riesen-String, der dann aber durchaus 80MB lang werden kann?)

und ganz besonders wichtig:
wie lese ich sie anschließend guppenweise als 2x INT und 2x FLOAT wieder zurück im laufenden Sketch-Programm?







hallo Thorsten,
habe deinen Post gar nicht gelesen, er kam wohl als ich gerade selber geschrieben habe.



Zitat:geschrieben wurde die 1 als string "1"
gelesen wurde sie auch wieder als string "1" (byteweise, bis zum Auftreten eines '\n'),
nur dann konnte dieser gelesene String "1" mit scanf() oder atoi() nicht wieder in die Zahll 1 zurückverwandelt werden,

auch nicht, wenn man das '\n' am Schluss nach C-Standard durch den Stringbegrenzer '\0' ersetzt.

Auch kommt ja nach der 1 erstmal die 2,
dazwischen kommt das '\n', und da unterbricht er erstmal das Lesen,
also hat er den String mit der 2 ja noch gar nicht gelesen,
erst recht kennt er noch keine Floats dahinter,
trotzdem wandelt er "1" in irgendeinen Müll um mit der 1 dann am Schluss.

Du hast recht mit der gepatchten lib.c, aber wie sonst soll ich floats mit sprintf formatiert ausgeben können? das geht mit den Sch*** Standard-Sketch-libs gar nicht!






also nochmal, zur endgültigen Klärung - wie es richtig gehen soll:

... sag mir dann doch einfach mal bitte im Klartext (Sourcecode), wie ich stattdessen die genannten Daten schreiben und wieder lesen und zurückverwandeln soll, wenn es schon keine Sketch-Funktionen gibt (wie in stdio.h), die das C-Standard-mäßig erledigen...

die Daten lauten:

p=1 q=2 x=3.141593 y=987.654
p=2 q=4 x=4.22 y= 2.345
p=3 q=6 x=8.44 y=3.456
und anschließend noch weitere 4er-Gruppen ...

wie formatiere ich sie (per sprintf(sdata,...)? welcher formatstring?), um möglichst keine Dezimalstellen bei floats zu verlieren,
und dann einfach hintereinander in einen gemeinsamen langen String, jeweils getrennt durch Kommata?

(BTW: ich verwende eigtl. keine String-Klasse, ich verwende normalerweise nur char * sbuf[] )

Die Daten in der Datei insgesamt können durchaus 1 GB groß werden.
wie schreibe ich sie (einzeln oder gruppenweise mit myFile.println(sdata) ? und dadurch mit einem '\n' am Schluss der Zeile?
Oder sogar alle fortlaufend, durch Kommata getrennt, in einen Riesen-String, der dann aber durchaus 1 GB lang werden kann?)

und ganz besonders wichtig:
wie lese ich sie anschließend guppenweise als 2x INT und 2x FLOAT wieder zurück im laufenden Sketch-Programm?
mit stdio.h ginge das ganz einfach:
scanf(sdata, "%d%d%f%f", &p, &q, &x, &y);

also wie geht es mit Sketch?


auch wenn man die Daten (== einzelne kurze Zahlenstrings) durch Kommata trennt, ist ja noch nirgends erklärt, wie man sie später als Zahlen (!) wieder neu zurückbekommt!


(Außerdem stellt sich mir die Frage, ob die einzelnen kurzen Zahlenstrings wirklich "strings" sind, also immer einzeln Null-terminiert, genau so, wie es auch sprintf macht bzw. machen SOLLTE...?)
Aber es kann doch nicht sein, das ich der erste bin, der längere Zahlenketten inl. Ints und Floats auf ner SD speichern und später auch wieder lesen will ?!? Da müssen doch fertige Lösungen existieren ?!?
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  Daten Visualisieren MeisterQ 12 576 01.12.2016 19:36
Letzter Beitrag: MeisterQ
  Data Logger Daten auf SD Card schreiben Crichton 12 312 22.11.2016 18:32
Letzter Beitrag: Crichton
  No such file Brother Tak 3 106 21.11.2016 10:24
Letzter Beitrag: Brother Tak
  I2C Daten übertragen Gandalf 3 217 04.11.2016 13:20
Letzter Beitrag: hotsystems
  Zahl von SD-Card Modul einlesen und Var. zuweisen Nafetz 13 298 28.10.2016 10:12
Letzter Beitrag: hotsystems
  Daten über USB verarbeiten Felix91 10 330 12.10.2016 13:00
Letzter Beitrag: Tommy56
  Problem mit SD Card Library BennIY 4 194 06.10.2016 18:38
Letzter Beitrag: Bitklopfer
  Can-Bus Shield ok, aber keine Daten Clubsport 38 1.544 01.09.2016 14:17
Letzter Beitrag: Clubsport
  Serial Monitor ASCII 1 schreiben BennIY 11 581 01.08.2016 16:42
Letzter Beitrag: Mathias
  Daten an mysql diode1990 24 1.309 31.07.2016 10:29
Letzter Beitrag: Gandalf

Gehe zu:


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