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


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Matthias H. (streno)


Bewertung
0 lesenswert
nicht 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)


Bewertung
1 lesenswert
nicht 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)


Bewertung
1 lesenswert
nicht lesenswert
Danke, das hat mir als Antwort gereicht.

Habe das Problem mit der Funktion itoa gelöst.

von Cyblord -. (cyblord)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht lesenswert
Was bekommst Du denn für ein Fehler?

von Matthias H. (streno)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.