uart_puts("Dieses Programm schreibt Zeichen die per UART kommen auf das Display");
26
lcd_string("Programmbeschrei");
27
set_cursor(0,2);
28
lcd_string("bung siehe UART");
29
uart_puts("Bitte nun den gewüschten Text für Zeile 1 eintippen: (ACHTUNG: Das Display kann pro Zeile nur 16 Zeichen darstellen)");
30
anzeigea=uart_gets();
31
lcd_string(anzeigea);
32
uart_puts("Bitte nun den gewüschten Text für Zeile 2 eintippen:");
33
anzeigeb=uart_gets();
34
set_cursor(0,2);
35
lcd_string(anzeigeb);
36
uart_puts("Soll das Display geloescht werden, um neue Zeichen anzuzeigen: (Für Ja=1, und für Nein=2)");
37
janein=uart_getc();
38
if(janein==1)
39
{
40
lcd_string(clear);
41
set_cursor(0,2);
42
lcd_string(clear);
43
}
44
else
45
{}
46
}
47
}
Allerdings kommt beim Erstellen mit AVR Studio immer folgende
Fehlermeldung:
rm -rf UARTtoLCD.o uart.o lcd-routines.o UARTtoLCD.elf dep/*
UARTtoLCD.hex UARTtoLCD.eep UARTtoLCD.lss UARTtoLCD.map
Build succeeded with 0 Warnings...
avr-gcc.exe -mmcu=atmega8 -Wall -gdwarf-2 -Os -std=gnu99
-funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -MD -MP
-MT UARTtoLCD.o -MF dep/UARTtoLCD.o.d -c ../UARTtoLCD.c
../UARTtoLCD.c: In function 'main':
../UARTtoLCD.c:21: warning: implicit declaration of function
'UART_BAUT_SELECT'
../UARTtoLCD.c:30: warning: implicit declaration of function 'uart_gets'
../UARTtoLCD.c:30: error: incompatible types in assignment
../UARTtoLCD.c:33: error: incompatible types in assignment
make: *** [UARTtoLCD.o] Error 1
Build failed with 2 errors and 2 warnings...
Die Errors treten ja in diesen beiden Zeilen auf:
1
anzeigea=uart_gets();
2
3
anzeigeb=uart_gets();
Die Variable anzeigea soll für die erste Zeile auf dem LCD sein, und
anzeigeb für die zweite Zeile (ich verwende ein 2*16 Zeichen LCD).
Als Pegelwandler verwende ich einen MAX232, aber daran kanns hier ja
nicht liegen, da der Fehler ja schon beim Codeerstellen auftritt ;-).
Ich weiß nun nicht, ob ich da einen anderen Datentyp fur die Variablen
anzeigea und anzeigeb nehmen muss, oder ob die Funktion uart_gets()
vielleicht einfach nicht zum Empfangen von Strings ist......
Und dann muss ich ja noch irgendeine Funktion einbauen, die
kontrolliert, wann der String zu Ende ist, aber kann ich das nicht auch
einfach so lassen, und der String, der vom UART empfangen wird, muss
eben immer einfach 16 Zeichen haben?
Ich hoffe ihr könnt mir helfen!!!
Gruß, Steffen
Ok, danke schonmal!
Ich hab nun den Schreibfehler verbessert, und uart_gets in uart_getc
umbewandelt, jetzt sind die zwei warnings weg, aber die Fehler bestehen
weiterhin.
Nochmal die Frage: Muss ich noch eine Funktion einbauen, damit der
ATMega erkennt, wann der String zu Ende ist, oder reicht es einfach
immer einen String mit 16 Zeichen zu senden, und am Ende eben /n?
Gruß, Steffen
Geht das Einlesen eines Strings nicht mit: anzeigea=uart_gets(); ?
Wie lautet eine solche Funktion dann? Kann mir einer ein einfaches
Beispiel zeigen?
Das hier hab ich im Wiki hier gefunden:
1
uint8_tuart_getc(void)
2
{
3
while(!(UCSRA&(1<<RXC)))// warten bis Zeichen verfuegbar
4
;
5
returnUDR;// Zeichen aus UDR an Aufrufer zurueckgeben
6
}
7
8
voiduart_gets(char*Buffer,uint8_tMaxLen)
9
{
10
uint8_tNextChar;
11
uint8_tStringLen=0;
12
13
NextChar=uart_getc();// Warte auf und empfange das nächste Zeichen
14
15
// Sammle solange Zeichen, bis:
16
// * entweder das String Ende Zeichen kam
17
// * oder das aufnehmende Array voll ist
18
while(NextChar!='\n'&&StringLen<MaxLen-1){
19
*Buffer++=NextChar;
20
StringLen++;
21
NextChar=uart_getc();
22
}
23
24
// Noch ein '\0' anhängen um einen Standard
25
// C-String daraus zu machen
26
*Buffer='\0';
27
}
Brauch ich das alles, um einen String einzulesen?
Vielen Dank schon mal für eure Hilfe!!!!
Gruß, Steffen
uart_puts("Dieses Programm schreibt Zeichen die per UART kommen auf das Display");
27
lcd_string("Programmbeschrei");
28
set_cursor(0,2);
29
lcd_string("bung siehe UART");
30
uart_puts("Bitte nun den gewüschten Text für Zeile 1 eintippen: (ACHTUNG: Das Display kann pro Zeile nur 16 Zeichen darstellen)");
31
u8_BufferNextIn=0;
32
33
do{
34
chr_Character=uart_getc();
35
if(u8_BufferNextIn<(sizeof(anzeigea)-1))
36
{
37
anzeigea[u8_BufferNextIn]=chr_Character;
38
u8_BufferNextIn++;
39
}
40
charanzeigeb[u8_BufferNextIn]=0;
41
}while(chr_Character<'\n')
42
43
lcd_string(anzeigea);
44
uart_puts("Bitte nun den gewüschten Text für Zeile 2 eintippen:");
45
u8_BufferNextIn=0;
46
do{
47
chr_Character=uart_getc();
48
if(u8_BufferNextIn<sizeof(anzeigeb)-1)
49
{
50
anzeigeb[u8_BufferNextIn]=chr_Character;
51
u8_BufferNextIn++;
52
}
53
charanzeigeb[u8_BufferNextIn]=0;
54
}while(chr_Character<'\n')
55
56
set_cursor(0,2);
57
lcd_string(anzeigeb);
58
uart_puts("Soll das Display geloescht werden, um neue Zeichen anzuzeigen: (Für Ja=1, und für Nein=2)");
59
60
do{
61
janein=uart_getc();
62
}while(janein!=1);
63
lcd_string(clear);
64
set_cursor(0,2);
65
lcd_string(clear);
66
}
Trotzdem bekomme ich 10 Fehlermeldungen, und 4 Warnings:
Build started 28.7.2008 at 22:19:58
avr-gcc.exe -mmcu=atmega8 -Wall -gdwarf-2 -Os -std=gnu99
-funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -MD -MP
-MT UARTtoLCD.o -MF dep/UARTtoLCD.o.d -c ../UARTtoLCD.c
../UARTtoLCD.c: In function 'main':
../UARTtoLCD.c:22: error: expected '=', ',', ';', 'asm' or
'__attribute__' before 'uart_init'
../UARTtoLCD.c:37: warning: array subscript has type 'char'
../UARTtoLCD.c:40: error: variable-sized object may not be initialized
../UARTtoLCD.c:40: warning: unused variable 'anzeigeb'
../UARTtoLCD.c:43: error: expected ';' before 'lcd_string'
../UARTtoLCD.c:50: warning: array subscript has type 'char'
../UARTtoLCD.c:53: error: variable-sized object may not be initialized
../UARTtoLCD.c:53: warning: unused variable 'anzeigeb'
../UARTtoLCD.c:56: error: expected ';' before 'set_cursor'
../UARTtoLCD.c:61: error: 'janein' undeclared (first use in this
function)
../UARTtoLCD.c:61: error: (Each undeclared identifier is reported only
once
../UARTtoLCD.c:61: error: for each function it appears in.)
../UARTtoLCD.c:63: error: 'clear' undeclared (first use in this
function)
../UARTtoLCD.c:66: error: expected declaration or statement at end of
input
make: *** [UARTtoLCD.o] Error 1
Build failed with 10 errors and 4 warnings...
Was habe ich nun falschgemacht?
Bin echt am Verzweifeln, weil das Programm einfach nicht richtig
erstellt wird :-(.
Ich hoffe jemand kann mir helfen.
Gruß, Steffen
Hi,
rhetorische Frage:
Was will Dir der Compiler denn wohl mit
> ../UARTtoLCD.c:22: error: > expected '=', ',', ';', 'asm' ...
sagen?
Antwort: In der nächsten Zeile ("int janein" und in mehreren anderen in
diesem Code) fehlt das ";" am Ende!
Wie reagiert man auf solche Fehlermeldungen? Immer zunächst die erste zu
verstehen versuchen, dann korrigieren, alles neu kompilieren usw.
Gruß
risu
Hallo,
> Bin echt am Verzweifeln, weil das Programm einfach nicht> richtig erstellt wird :-(.
P.S.: Du erstellst das Programm und bist Urheber der Fehlermeldungen,
nicht der Compiler!
Gruß
risu
Ok, danke für die Tips!!! Die ; hatte ich im Eifer des Gefechts
schlichtweg vergessen, beim kopieren und einfügen, usw. :-)
Ich hab die Ausgabe jetzt auf 2 Fehler und 6 Errors verkleinern können:
Build started 29.7.2008 at 11:51:06
avr-gcc.exe -mmcu=atmega8 -Wall -gdwarf-2 -Os -std=gnu99
-funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -MD -MP
-MT UARTtoLCD.o -MF dep/UARTtoLCD.o.d -c ../UARTtoLCD.c
../UARTtoLCD.c: In function 'main':
../UARTtoLCD.c:38: warning: array subscript has type 'char'
../UARTtoLCD.c:41: error: variable-sized object may not be initialized
../UARTtoLCD.c:41: warning: unused variable 'anzeigea'
../UARTtoLCD.c:51: warning: array subscript has type 'char'
../UARTtoLCD.c:54: error: variable-sized object may not be initialized
../UARTtoLCD.c:54: warning: unused variable 'anzeigeb'
../UARTtoLCD.c:64: warning: passing argument 1 of 'lcd_string' makes
pointer from integer without a cast
../UARTtoLCD.c:66: warning: passing argument 1 of 'lcd_string' makes
pointer from integer without a cast
make: *** [UARTtoLCD.o] Error 1
Build failed with 2 errors and 6 warnings...
Die zwei Errors mit variable-sized object may not be initialized treten
in folgenden Zeile auf:
1
charanzeigea[u8_BufferNextIn]=0;
2
charanzeigeb[u8_BufferNextIn]=0;
Er meint ja, dass irgendwelche Variablen nicht initialisiert sind. Aber
in diesen beiden Zeilen sind doch alle initialisiert, oder?
Mein Code ist immernoch gleich, bis eben auf die Fehler, die ich
korriegiert habe.
Gruß, Steffen
Die Zeile:
> char anzeigea[/*...*/];
gibt's weiter oben im Code schon,
Also lösch bei den Zeilen mit dem Fehler das "char" am Anfang.
> warning: array subscript has type 'char'
Nimm' "signed char" oder "unsigned char" als Index für die Arrays
Lern C! Copy&Paste-Programmieren funktioniert bei C besonders schlecht.
hth. Jörg
Danke für die Hilfe!!!
Ich hab ja das Programm schon alleine geschrieben, aber t.b.d. hat dann
einige Codeschnipsel gepostet, die ich dann noch in mein Programm
eingefügt habe, und beim einfügen hab ich eben die ; vergessen ;-).
Nun kann ich das Projekt erstellen, wenn auch mit 4 Warnings, aber es
wird immerhin erstellt!
Nun muss ich nur noch testen, ob es dann auch schlussendlich läuft.
Aber trotzdem schonmal vielen Dank an alle, die mir so weit geholfen
haben!!!
Gruß, Steffen