UART-String ins EEPROM schreiben

OP #1555367
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
Angehängte Dateien:
OP #1555500
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
#1555543
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.
OP #1555645
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
#1555655
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]"?
#1555677
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?
OP #1557397
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
#1558768
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.
#1559832
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
OP #1590456
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren