Forum: Mikrocontroller und Digitale Elektronik UART-Kommunikation atmega88 , rs232 ,HTerm.exe


von Lucas Pelchen (Gast)


Angehängte Dateien:

Lesenswert?

Hallo Zusammen,

ich habe mir das Franzis Lernpaket Microcontroller in C programmieren 
gekauft und habe bei dem Projekt zur UART-Kommunikation ein Problem.
Im Anhang findet ihr die main.c-Datei und die Fehlermeldung beim 
Compilieren.
Das Problem ist dass ich nur dann meine unsigned char Array schicken 
kann wenn ich es bei der Implementierung des Arrays definiere, d.h. wenn 
ich unsigned char str[10] = "abcdefgh"; schreibe. Wenn ich aber nur ein 
unsigned char str[10]; implementiere und später str[10]="abcdefgh" 
definieren möchte kann ich es nicht ohne die Fehlermeldungen.

Ich hoffe Ihr könnt mir da weiter helfen, da ich ehrlich gesagt nicht 
verstehe warum es nicht funktioniert. Nach meinem Verständnis ist es 
doch egal ob ich bei der Implementierung definiere oder erst danach.

Vielen Dank im Voraus und frohe Feiertage.

von Gerd (Gast)


Lesenswert?

Hallo,
Das Problem ist, dass diese Zeile
str[10]="abcdefgh"
das 10. Element des Array mit einer ganzen Zeichenkette beschreiben 
möchte. Das geht natürlich nicht. Das "[10]" muss weg.

von Ohmy God (Gast)


Lesenswert?

Lucas Pelchen schrieb:
> da ich ehrlich gesagt nicht
> verstehe warum es nicht funktioniert.

Prinzipiell liegt es daran dass du es nicht gewagt hast ein
Buch über C Grundlagen zu lesen und daraus zu lernen.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Lucas Pelchen schrieb:
> Wenn ich aber nur ein unsigned char str[10]; implementiere und später
> str[10]="abcdefgh" definieren möchte kann ich es nicht ohne die
> Fehlermeldungen.

Dein C-Buch verrät Dir, was Du hier falsch machst. Stichwort "Zuweisung" 
und Stichwort "Zugriff auf Array-Elemente".

Abgesehen davon ist Deine Verwendung der Begriffe "implementieren" und 
"definieren" falsch.
1
char str[100];

hiermit definierst Du ein char-Array mit 100 Elementen

1
str[100] = "abcdefghi";

hiermit versuchst Du, dem 101. Element Deines char-Arrays eine 
Stringkonstante zuzuweisen

Die Elemente eines char-Arrays aber sind chars (d.h. ein einzelnes 
Zeichen), denen kann man nur einzelne Zeichen, nicht aber Zeichenketten 
zuweisen.

Und: Du greifst auf das 101. Element zu, Dein Array aber hat nur 100 
Elemente.

In C (und anderen C-artigen Programmiersprachen) hat das erste Element 
eines Arrays den Index 0 und nicht 1.

von Lucas Pelchen (Gast)


Angehängte Dateien:

Lesenswert?

Vielen Dank für die schnelle Antworten.
die Tatsache ist, dass ich es auch schon ohne [10] versucht habe es 
jedoch auch zu einer Fehlermeldung kommt. was ich nicht verstehe warum 
die "abc..."-Folge als const char[10] definiert ist.
Ich muss zugeben dadurch, dass ich eig. immer vorzugsweise mit string 
arbeite, statt mit char muss ich mich daran noch gewöhnen.

von Ohmann (Gast)


Lesenswert?

Lucas Pelchen schrieb:
> Vielen Dank für die schnelle Antworten.
> die Tatsache ist, dass ich es auch schon ohne [10] versucht habe es
> jedoch auch zu einer Fehlermeldung kommt. was ich nicht verstehe warum
> die "abc..."-Folge als const char[10] definiert ist.
> Ich muss zugeben dadurch, dass ich eig. immer vorzugsweise mit string
> arbeite, statt mit char muss ich mich daran noch gewöhnen.

Weil es in C eben keinen Datentyp String gibt. Einzelzeichen werden im 
Typ char gespeichert, z.B. 'a' oder als Hexadezimalwert 0x61. 
Zeichenketten werden in einem Array von Chars angelegt und mit dem \0 - 
Nullterminator abgeschlossen. Ein String in C ist also ein Array 
bestehend aus lauter Einzelzeichen mit Terminierung.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Ohmann schrieb:
> Ein String in C ist also ein Array bestehend aus lauter Einzelzeichen
> mit Terminierung.

Hinzu kommt, daß C keine Zuweisung von Arrays kennt.

von Lucas Pelchen (Gast)


Angehängte Dateien:

Lesenswert?

Danke für die Informationen zu den Arrays in c. Aber ich verstehe nicht 
warum es nicht funktioniert das unsigned char Array str mit dem Wert 
"abcdefghi" zu füllen. Selbst wenn der \0-Terminator an die 
"abcdefghi"-Folge angeschlossen wird?
Was mich verwirrt: Im c-File des Beispielprogramms funktionert alles.

von A. (Gast)


Lesenswert?

Versuchs mal mit:

[c]
char * s;

while(1){
  s = "Text";
}

von H.Joachim S. (crazyhorse)


Lesenswert?

In deinem Beispiel:

dtostrf(Cap,1,3,str);
uart_putStr(str);

von Joachim B. (jar)


Lesenswert?

Lucas Pelchen schrieb:
> Aber ich verstehe nicht
> warum es nicht funktioniert das unsigned char Array str mit dem Wert
> "abcdefghi" zu füllen. Selbst wenn der \0-Terminator an die
> "abcdefghi"-Folge angeschlossen wird?

du reservierst Platz für unsigned char str[10]; 10 Zeichen

dann kannst du zwar bis zu 10 Zeichen reinschreiben, hier mit 8 Zeichen 
"abcdefgh" aber das Ende der NULL Terminator fehlt.

Jede Funktion die nun nicht weiss wo das Ende ist liest bis ins Nirwana.

mit strcpy(str, "abcdefgh"); kopierst du nun die "abcdefgh" in deine 
Variable str mit NULL am Ende.
In str liegt nun "abcdefgh\0" also abis h 8 Zeichen + die 0 am Ende also 
9 Zeichen belegt.

Die Zählweise bei unsigned char str[10]; geht aber von str[0] erstes 
Zeichen  bis str[9] letztes 10tes Zeichen. Der "String" ist aber nur 8 
Zeichen lang "abcdefgh" zähle durch von str[0] bis str[9] und das Ende 
ist str[8] als 9tes Zeichen mit der NULL, das str[9] ist zwar nicht leer 
aber ungenutzt, kann irgendwas drin sein.
Jede Funktion die mit str arbeitet, strcpy, strcmp, strcat weiss das und 
arbeitet bis zur NULL so sie vorhanden ist, ohne NULL gehst in die IRRE 
und es crasht!
Steht aber in JEDEM C-Buch.

von Lucas Pelchen (Gast)


Lesenswert?

Danke die strcpy()-Funktion is'n super tipp. Funktioniert wie es soll. 
Dank euch.

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.