Forum: Mikrocontroller und Digitale Elektronik SD-Karte Verständnisproblem


von Matthias H. (streno)


Lesenswert?

Hallo,

ich versuche eine SD-Karte zu beschreiben mit der Bibliothek von Daniel 
R.
Diese habe ich auch super zum laufen gebracht.
Ich möchte meine gespeicherten Daten auf der SD-Karte abspeichern

Nun meine Frage:

es gibt die Funktion ffwrite( uint8_t c)

Wenn ich nun meine Daten schreiben will, erhalte ich immer ASCII-Zeichen 
auf der SD-Karte.

Muss ich also zuerst meinen int in ASCII umwandeln und ihn dann senden? 
Oder wie schreibe ich z.B. die Zahl 123 auf die SD-Karte
mit ffwrite(123); erhalte ich "{"

Kann jemand Licht ins dunkle bringen?

Grüße
Matthias

von HildeK (Gast)


Lesenswert?

Matthias H. schrieb:
> es gibt die Funktion ffwrite( uint8_t c)

Wie die Zeile schon sagt: es wird ein unsigned Byte geschrieben. 123 
steht nun mal für das '{', also ist alles korrekt.
Wenn du '1', '2', '3' haben willst, dann sind das drei Byte und du musst 
sie vorher zerlegen.

von Matthias H. (streno)


Lesenswert?

Danke, das hat mir als Antwort gereicht.

Habe das Problem mit der Funktion itoa gelöst.

von Cyblord -. (cyblord)


Lesenswert?

Matthias H. schrieb:
> Danke, das hat mir als Antwort gereicht.
>
> Habe das Problem mit der Funktion itoa gelöst.

Geradezu genial. Auch wenn das Problem ganz wo anders sitzt.

von Adam P. (adamap)


Lesenswert?

Matthias H. schrieb:
> Wenn ich nun meine Daten schreiben will, erhalte ich immer ASCII-Zeichen
> auf der SD-Karte.
>
> Muss ich also zuerst meinen int in ASCII umwandeln und ihn dann senden?

Das widerspricht sich! 1, 2, 3 sind auch ASCII Zeichen.
Wie man ein Byte interpretiert ist wichtig.


Cyblord -. schrieb:
> Geradezu genial.

:-D


Matthias H. schrieb:
> Habe das Problem mit der Funktion itoa gelöst.

Mich würde es echt interessieren, wie du das nun mit der itoa() gelöst 
hast.

Aber warum nutzt du nicht einfach eine andere Funktion, z.B.:
1
ffwrites("123");

: Bearbeitet durch User
von Matthias H. (streno)


Lesenswert?

Adam P. schrieb:
> Mich würde es echt interessieren, wie du das nun mit der itoa() gelöst
> hast.
1
  char Buffer[20];
2
  PORTB = ( 1 << PB0);
3
  itoa(sendedaten,Buffer,10);
4
  
5
  if( MMC_FILE_OPENED == ffopen(file_name,'r') ){
6
    ffseek(file.length);
7
    ffwrites(Buffer);
8
    ffwrite(0x0D);    // new line in file
9
    ffwrite(0x0A);
10
    ffclose();
11
  }

In meinem ersten Programm hat das geklappt.
Es gab nur eine Warnung, da Buffer als char deklariert wurde und 
ffwrites uint8_t erwartet.
Aber wie gesagt, hat funktioniert.

Jetzt habe ich das in mein komplettes Programm eingebunden und nun 
bekomme ich anstatt der warnung einen Error.

Warum funktioniert es als Solo-Projekt aber nicht in meinem kompletten 
Programm? Ist doch das gleiche??

von Fabian H. (hdr)


Lesenswert?

Was bekommst Du denn für ein Fehler?

von Matthias H. (streno)


Lesenswert?

Fabian H. schrieb:
> Was bekommst Du denn für ein Fehler?


Error    invalid conversion from 'char*' to 'uint8_t* {aka unsigned 
char*}' [-fpermissive]

Diesen Fehler hatte ich im Soloprojekt nicht. Nur eine Warnung

von Adam P. (adamap)


Lesenswert?

ffwrites() erwartet doch 'unsigned char *'

Änder die Definition deines Buffers oder caste.
1
ffwrites((unsigned char *)Buffer);

: Bearbeitet durch User
von Matthias H. (streno)


Lesenswert?

Das wars, danke!

Ich habe aber gemerkt dass die Funktion itoa sehr lange brauch, um die 
Daten zu wandeln. Gibt es nicht eine Möglichkeit die Integerwerte direkt 
auf die SD-Karte zu schreiben, ohne sie vorher in einen String 
umzuwandeln?

von Adam P. (adamap)


Lesenswert?

Matthias H. schrieb:
> ohne sie vorher in einen String
> umzuwandeln?

Deine Variable 'sendedaten' ist ein integer? Und enthält z.B. den Wert 
123?
Dann wirst du um eine Konvertierung nicht herumkommen, ob du es aber mit 
itoa() machen solltest - vllt. mal selbst konvertieren und Zeit messen.

: Bearbeitet durch User
von Jim M. (turboj)


Lesenswert?

Matthias H. schrieb:
> Es gab nur eine Warnung, da Buffer als char deklariert wurde und
> ffwrites uint8_t erwartet.

Das hätte ich spontan als Bugreport an den Author geschickt. Strings 
will man als char* übergeben. Die uint8_t* sind für die BlockWrite 
Funktionen besser, wo der Puffer Null Bytes enthalten darf (und daher 
eine Länge mit angegeben wird).

Matthias H. schrieb:
> Ich habe aber gemerkt dass die Funktion itoa sehr lange brauch, um die
> Daten zu wandeln. Gibt es nicht eine Möglichkeit die Integerwerte direkt
> auf die SD-Karte zu schreiben, ohne sie vorher in einen String

Der Zeitbedarf von itoa() ist verschwindend gering im Vergleich zu 
ffwriteX() falls ein neuer Sektor benutzt werden muss. Ich zweifle da 
mal spontan Deine Messmethode an.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.