UART-Kommunikation atmega88 , rs232 ,HTerm.exe

Gast #5253889
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.
Angehängte Dateien:
Persönliche Seite #5253914
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.
Gast #5254003
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.
Angehängte Dateien:
Gast #5254042
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.
Gast #5254196
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.
Angehängte Dateien:
#5254208
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.

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