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


von Alexander S. (knut740)


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:
1
198,1,205,1,165,1,192,1,185,1,188,1,212,1,202,1,165,1,181,1,199,1,
2
185,1,174,1,185,1,178,1,151,1,174,1,182,1,174,1,161,1,192,1,185,1,
3
174,1,195,1,175,1,208,1,218,1,215,1,231,1,232,1,229,1,231,1,228,1,
4
228,1,230,1,230,1,230,1,230,1,227,1,227,1,225,1,226,1,225,1,223,1,
5
...


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

Mit fgetc bekomme ich die ASCII-Werte der einzelnen Zeichen,
also
1
 
2
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

von Karl H. (kbuchegg)


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.

von Alexander S. (knut740)


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
1
   
2
      int a,b;
3
      for (index=0; index <10; index++)
4
      {
5
      a = fscanf(fquell, "%d" ,&b) ; 
6
      printf ("  %d ", a);
7
      };

gibt es
1
 
2
 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 
.

von Alexander S. (knut740)


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?

von Karl H. (kbuchegg)


Lesenswert?

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

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

von Alexander S. (knut740)


Lesenswert?

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

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

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.