mikrocontroller.net

Forum: Compiler & IDEs EEPROM - wie organisiert? wie auslesen?


Autor: Alexander Schmeil (knut740)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

Ich möchte gern im EEPROM gespeichterte Daten für ein anderes Programm 
aufbereiten.

1.Der Inhalt meines EEPROMS, mit avrdude ausgelesen, sieht so aus:
198,1,205,1,165,1,192,1,185,1,188,1,212,1,202,1,165,1,181,1,199,1,
185,1,174,1,185,1,178,1,151,1,174,1,182,1,174,1,161,1,192,1,185,1,
174,1,195,1,175,1,208,1,218,1,215,1,231,1,232,1,229,1,231,1,228,1,
228,1,230,1,230,1,230,1,230,1,227,1,227,1,225,1,226,1,225,1,223,1,
...


Und dann, mit "normalem" C-Compiler (also ohne AVR-Anbindung), komme ich 
nicht weiter:
Mit
       for (index=0; index<sizeof(daten)/3; index++)
       {
      fgets(daten, 10,fquell) ;      
      fputs ( daten, stdout);
      printf("\n"); 
      };
bekomme ich
198.1.205
.1.165.1.
165.1.193
...

Mit fgetc bekomme ich die ASCII-Werte der einzelnen Zeichen,
also
 
1  9  8  44  1  2  0  5 ... 
 (z.B.44 steht für das Komma, im obigen Beispiel sind stattdessen Punkte 
als Trennzeichen ausgegeben).

Lasse ich von avrdude den EEPROM-Inhalt binär ausgeben, dann wird mit 
fgetc bzw. fgets sogar das 1b mit ausgegeben.

Eine Funktion, die ein Byte nach dem anderen ausgibt, habe ich leider 
nicht gefunden

Ich wollte aus dem avrdude-dump eine Reihe von Byte1 + Byte2, nächste 
Ausgabe Byte3 + Byte4 usw bekommen. Muß man also das manuell aus den 
Einzelzeichen von fgetc zusammensetzen - oder gibt es da elegentere 
Möglichgkeiten?

Gruß
Alexander

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn es sich um eine von Hand erzeugte Datei handeln würde, würde ich 
fgets+sscanf nehmen. (*)
Übrigens, dein fgets Ergebnis (ich gehe mal davon aus, dass die . ein 
Posting Fehler sind), sieht deshalb so aus, weil du ihm gesagt hast, du 
möchtest 10 Zeichen in einem Rutsch lesen. fgets liest Strings, nicht 
Integer.

Da es sich aber hier um ein maschinengeneriertes File handelt, dessen 
Formatierung sich nicht ändern wird und bei dem auch nicht mit 
Tippfehlern im File zu rechnen ist: Was spricht gegen fscanf?


(*) Der Weg gehts dann so:
Mit fgets wird eine komplette Zeile in einen String eingelesen, 
welcher dann mit sscanf zerlegt wird. Mit dieser Variante ist die 
Fehlerbehandlung meistens deutlich einfacher als wie wenn gleich direkt 
mit fscanf gearbeitet wird. Auch die Ausgabe von Fehlermeldungen, die 
sich ja normalerweise auf die Zeilennummer beziehen, ist dann leichter 
machbar.

Autor: Alexander Schmeil (knut740)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Karl heinz Buchegger schrieb:
> Was spricht gegen fscanf?

Ist auch nicht die reine Freude, allerdings verstehe ich in meinen 
Büchern die Beschreibung nicht so recht. Mit
   
      int a,b;
      for (index=0; index <10; index++)
      {
      a = fscanf(fquell, "%d" ,&b) ; 
      printf ("  %d ", a);
      };

gibt es
 
 1 0 0 0 0 0 0 0 0 0

PS In dem ersten Posting waren es tatsächlich Kommas, ich hatte sie als 
Punkte gelesen. Meine Daten aus dem EEPROM sind in einer einzigen Zeile 
.

Autor: Alexander Schmeil (knut740)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Karl heinz Buchegger schrieb:
> (*) Der Weg gehts dann so:
> Mit fgets wird eine komplette Zeile in einen String eingelesen,
> welcher dann mit sscanf zerlegt wird. Mit dieser Variante ist die
> Fehlerbehandlung meistens deutlich einfacher als wie wenn gleich direkt
> mit fscanf gearbeitet wird. Auch die Ausgabe von Fehlermeldungen, die
> sich ja normalerweise auf die Zeilennummer beziehen, ist dann leichter
> machbar.

Aber mit fgets würde ich aus meiner Einzeilendatei eine Datei erhalten, 
die auch wieder nur alle 500 Werte in einer Zeile enthält?

Also fscanf und Originaldatei - wenn man es nur ordentlich formatieren 
und Byte um Byte erfassen könnte!

Vielleicht sollte ich mir beim Auslesen des EEPROMS mehr Mühe geben und 
auf die bequeme Methode mit avrdude verzichten?

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Alexander Schmeil schrieb:
> Karl heinz Buchegger schrieb:
>> Was spricht gegen fscanf?
>
>
>       int a,b;
>       for (index=0; index <10; index++)
>       {
>       a = fscanf(fquell, "%d" ,&b) ;
>       printf ("  %d ", a);
>       };
> 
>
> gibt es
>
>
>  1 0 0 0 0 0 0 0 0 0
> 
>

Logo.
Du hast ja fscanf auch nicht gesagt, was es mit dem Komma machen soll

Autor: Alexander Schmeil (knut740)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Karl heinz Buchegger schrieb:
> Logo.
> Du hast ja fscanf auch nicht gesagt, was es mit dem Komma machen soll

Es funktioniert,
a = fscanf(fquell, "%d,%d%,", &b , &c) ;
war die Lösung.
Danke für die Hilfe
mfg
A.

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]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [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.