Forum: Compiler & IDEs UART-String ins EEPROM schreiben


von Joachim B. (jojo84)


Angehängte Dateien:

Lesenswert?

Hallo!

Ich versuche seit geraumer Zeit es hinzu bekommen, daß ich eine 
Zeichenkette, die über die Tastatur eingelesen wird, im EEPROM 
abgespeichert wird. Aber das will nicht so recht. Die Übertragung 
funktioniert, und das Speichern in einer "flüchtigen" Variablen auch. 
Aber ich krieg das Ding nicht ins EEPROM. Hab dafür folgende Funktion 
geschrieben:
1
char ee_serial_number[20] EEMEM;
2
char line[20];
3
4
int main()
5
{
6
   ...
7
        string_to_eeprom(line, ee_serial_number);
8
   ...
9
}
10
11
void string_to_eeprom(char *input, char *destination)
12
{
13
  for(char x = 0; &input[x] != '\0'; x++)
14
  {
15
    eeprom_write_byte(&destination[x], &input[x]);
16
  }
17
}

In dem Array "line[]" steht die eingelesene Zeichenkette. Und dann 
wollte ich das eben so machen, daß Element für Element ins EEPROM 
übertragen wird, mit Überprüfung auf das String-Endzeichen.
Aber da überhäuft mich AVR Studio mit Meldungen im Anhang...
Die "write_block"-Funktion hab ich mir schon angeguckt. Aber ich will ja 
nicht einen festen Block übergeben, sondern nur alles bis zum 
String-Endzeichen.
Fürde mich freuen, wenn mir einen den Fehler erklären könnte... =)

DANKE,

mfG,
Joachim

von Sauger (Gast)


Lesenswert?

Die Warnungen sagen doch schon alles. Du solltest dich mal mit der 
Schreibweise von Pointern und Adressen beschäftigen (& vs. *)

MfG

von Joachim B. (jojo84)


Lesenswert?

Ja, sowas hab ich befürchtet. Ich hab mein C-Buch hier auch liegen, aber 
irgendwie check ich das noch nicht wirklich. Ich möchte ja nicht, daß 
mir einer ne Code hier korrigiert. Ich weiß nur einfach nicht weiter, 
"was" genau der Fehler ist. "Wo" steht ja das, das seh ich ;) ...

Danke nochmal,
mfG,
Joachim

von Stefan E. (sternst)


Lesenswert?

Was bedeutet "&input[x]"? Drücke das mal in Worten aus.

von Joachim B. (jojo84)


Lesenswert?

Ich dachte es würde heißen "die Adresse vom Element 'x' von 'input'".

In der Zeile wollte ich den Wert der Speicherstelle vom Element 'x' von 
'input' auf '\0' überprüfen... hab ich da nen Denkfehler drin?

von Stefan E. (sternst)


Lesenswert?

Joachim A. schrieb:
> Ich dachte es würde heißen "die Adresse vom Element 'x' von 'input'".

Richtig.

> In der Zeile wollte ich den Wert der Speicherstelle vom Element 'x' von
> 'input' auf '\0' überprüfen... hab ich da nen Denkfehler drin?

Du hast doch schon selbst erkannt, dass es die Adresse ist. Warum sollte 
es jetzt auf einmal der Wert sein?
Dein aktueller Vergleich ist ein wenig wie "Hausnummer != Müller".

PS: Und an der zweiten Stelle, wo du es verwendest, ist es auch falsch.

von Sauger (Gast)


Lesenswert?

> Ich dachte es würde heißen "die Adresse vom Element 'x' von 'input'".

möchtest du die Adresse (&) oder deren Inhalt (*) prüfen?


MfG

von Joachim B. (jojo84)


Lesenswert?

Ich glaub es ist hoffnungslos... -_o

Ich möchte ja den Inhalt (*?) einer Speicherstelle mit einer bestimmten 
Adresse (&?) überprüfen und anschließend den Inhalt dieser 
Speicherstelle mit dieser Adresse an einer anderen Speicherstelle mit 
einer anderen Adresse ablegen.
Habe gerade etwas gelesen, daß ich etwas "casten" muß, z.B. so:
string_to_eeprom((char*) &line, (char*) &ee_serial_number);
Aber selbst wenn das klappen würde hab ich ja immer noch nicht wirklich 
verstanden, was ich da tu!
Ich hab mich besher mit vielen seltsamen Syntax-Sachen angefreundet. 
Aber das mit den Pointern und so... nenene...

MfG

von Stefan E. (sternst)


Lesenswert?

Joachim A. schrieb:

> Ich möchte ja den Inhalt (*?) einer Speicherstelle mit einer bestimmten
> Adresse (&?) überprüfen und anschließend den Inhalt dieser
> Speicherstelle mit dieser Adresse an einer anderen Speicherstelle mit
> einer anderen Adresse ablegen.

Du willst gar keine Adressen "überprüfen" oder "ablegen". Du denkst viel 
zu kompliziert.

Versuchen wir es mal anders herum: was bedeutet (in Worten) "input[x]"?

von Werner B. (werner-b)


Lesenswert?

...oder ganz einfach ausgedrückt...

Ändere alle Vorkommen von
1
&input[x]

in
1
input[x]

von Joachim B. (jojo84)


Lesenswert?

@Stefan
ich bin ja von deiner Geduld beeindruckt :)

"input[x]" bedeutet in Worten "Element 'x' des Arrays 'input[]'". Und 
das hat eine bestimmte Adresse ;) ...

von Stefan E. (sternst)


Lesenswert?

Joachim A. schrieb:

> "input[x]" bedeutet in Worten "Element 'x' des Arrays 'input[]'". Und
> das hat eine bestimmte Adresse ;) ...

Ja, aber was interessiert dich diese Adresse? Ist "Element 'x' des 
Arrays 'input[]'" nicht genau das, was du haben willst? Ist "Element 'x' 
des Arrays 'input[]'" nicht genau das, was du mit '\0' vergleichen 
willst? Ist "Element 'x' des Arrays 'input[]'" nicht genau das, was du 
ins EEPROM schreiben willst?

von Joachim B. (jojo84)


Lesenswert?

Hmmm, berechtigter Einwand... ich probiere mal eben rum. Ich glaub der 
Groschen fällt...

von Joachim B. (jojo84)


Lesenswert?

Also an dieser Stelle erstmal danke an euch :)
So ganz läuft es zwar immer noch nicht, wie es soll, aber ich bin schon 
einige Schritte weiter. Den Rest krieg ich wohl selbst hin.
Jetzt würd ich nurnoch gern wissen, ich ich Zeichen unmittelbar an den 
µC senden kann. Ich nutze z.Z "HTerm". Da kann man ja eine Zeichenkette 
eingeben und dann alles zusammen senden. Das find ich aber doof. Ich 
möchte eigentlich, daß man immer direkt auf dem Bildschirm sieht, was 
grad eingetippt wird. Das Zeichen soll also DIREKT beim Tastendruck 
gesendet werden, dann sendet der Controller es zurück und es wird auf 
dem Bildschirm dargestellt (normal, dachte ich). Weiß da einer bescheid?

VG

von Karl H. (kbuchegg)


Lesenswert?

Joachim A. schrieb:
> µC senden kann. Ich nutze z.Z "HTerm". Da kann man ja eine Zeichenkette
> eingeben und dann alles zusammen senden.

Möglich das man HTerm so einstellen kann.
Normal ist das nicht. Normal ist bei einem Terminal, dass es jedes 
Zeichen, sobald du die Taste drückst, über die Serielle verschickt wird.

> Das find ich aber doof. Ich
> möchte eigentlich, daß man immer direkt auf dem Bildschirm sieht, was
> grad eingetippt wird.

Dann kontrollier einfach mal dein Programm im AVR, ob es ein empfangenes 
Zeichen sofort quittiert und zurückschickt, oder ob es wartet bis eine 
Zeile beisammen ist.

> Das Zeichen soll also DIREKT beim Tastendruck
> gesendet werden, dann sendet der Controller es zurück und es wird auf
> dem Bildschirm dargestellt (normal, dachte ich).

Das ist auch die normale Einstellung aller Terminals.

von Joachim B. (jojo84)


Lesenswert?

Ok, dankeschön. Dann ward ich mal gucken, ob ich den Bug finde...

von Günter R. (galileo14)


Lesenswert?

Karl heinz Buchegger schrieb:
> Joachim A. schrieb:
>> µC senden kann. Ich nutze z.Z "HTerm". Da kann man ja eine Zeichenkette
>> eingeben und dann alles zusammen senden.
>
> Möglich das man HTerm so einstellen kann.
> Normal ist das nicht. Normal ist bei einem Terminal, dass es jedes
> Zeichen, sobald du die Taste drückst, über die Serielle verschickt wird.

Joachim hat ganz recht; in HTerm kann man eine ganze Zeile eingeben, die 
dann auf einen Schlag gesendet wird; vor dem Senden kann man den 
Zeileninhalt auch editieren, wenn man einen Fehler gemacht hat. Daraus 
erkennt man, daß HTerm kein "normales Terminalprogramm" ist (obwohl es 
"HTerm" heißt), sondern ein ganz tolles Diagnosetool für serielle 
Datenübertragung (danke, Tobi!); es zeigt ja auch Sende- und 
Empfangsdaten in unterschiedlichen Fenstern an, was ein "normales 
Terminalprogramm" nie tut...

Ein "normales Terminalprogramm", wie Karl Heinz es beschreibt, ist z.B. 
HyperTerm (Gott bewahre!) oder ZOC (super, kostet aber etwas).

Günter

von Joachim B. (jojo84)


Lesenswert?

Hoffe es ist noch nicht ganz Off-Topic. Aber mit dem Programm "Terminal" 
von Br@y geht es ganz gut :) . Das sendet auch direkt bei Tastendruck. 
Ich bin grad nicht ganz sicher, ob es in den entsprechenden Artikeln 
schon steht. Aber evtl. wäre es gut, wenn man das da ergänzen könnte, 
daß es da entscheidende Unterschiede bei den Terminalprogrammen gibt. 
Müssen sich ja nicht noch mehr Leute wundern ;)
Das Windoof eigene Hyperterminal funktioniert übrigens bei mir gar 
nicht. Das stürzt nach dem x-ten Tastendruck einfach ab...

VG

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.