www.mikrocontroller.net

Forum: Compiler & IDEs UART-String ins EEPROM schreiben


Autor: Joachim B. (jojo84)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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:
char ee_serial_number[20] EEMEM;
char line[20];

int main()
{
   ...
        string_to_eeprom(line, ee_serial_number);
   ...
}

void string_to_eeprom(char *input, char *destination)
{
  for(char x = 0; &input[x] != '\0'; x++)
  {
    eeprom_write_byte(&destination[x], &input[x]);
  }
}

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

Autor: Sauger (Gast)
Datum:

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

MfG

Autor: Joachim B. (jojo84)
Datum:

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

Autor: Stefan Ernst (sternst)
Datum:

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

Autor: Joachim B. (jojo84)
Datum:

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

Autor: Stefan Ernst (sternst)
Datum:

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

Autor: Sauger (Gast)
Datum:

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

Autor: Joachim B. (jojo84)
Datum:

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

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht 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]"?

Autor: Werner B. (werner-b)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
...oder ganz einfach ausgedrückt...

Ändere alle Vorkommen von
&input[x]

in
input[x]

Autor: Joachim B. (jojo84)
Datum:

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

Autor: Stefan Ernst (sternst)
Datum:

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

Autor: Joachim B. (jojo84)
Datum:

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

Autor: Joachim B. (jojo84)
Datum:

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

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

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

Autor: Joachim B. (jojo84)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ok, dankeschön. Dann ward ich mal gucken, ob ich den Bug finde...

Autor: Günter R. (galileo14)
Datum:

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

Autor: Joachim B. (jojo84)
Datum:

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

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.