Forum: Mikrocontroller und Digitale Elektronik Datentyp Stringübertragung UART Peter Fleury - ATMega8


von Steffen (Gast)


Lesenswert?

Hallo,
ich hab folgendes Programm geschrieben, welches einen String, der über 
UART kommt auf einem LCD darstellen soll:
1
#include<avr/io.h>
2
#include<avr/interrupt.h>
3
#include<stdlib.h>
4
5
#include"uart.h"
6
#include"lcd-routines.h"
7
8
#ifndef F_CPU
9
#define F_CPU 4000000
10
#endif
11
12
#define UART_BAUD_RATE 9600
13
14
int main(void) 
15
{
16
char anzeigea[16];
17
char anzeigeb[16];
18
char clear[16];
19
int janein=0;
20
21
uart_init(UART_BAUT_SELECT(UART_BAUD_RATE,F_CPU));
22
sei();
23
lcd_init();
24
while(1){
25
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

von Stefan E. (sternst)


Lesenswert?

1)
UART_BAUT_SELECT -> UART_BAUD_SELECT

2)
In der Fleury-UART-Lib gibt es kein uart_gets.

von Steffen (Gast)


Lesenswert?

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

von Steffen (Gast)


Lesenswert?

Weiß niemand, wie man das Problem beheben kann?
Gruß, Steffen

von Stefan E. (sternst)


Lesenswert?

Du musst erstmal eine Funktion schreiben, die einen String einliest.

von Steffen (Gast)


Lesenswert?

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_t uart_getc(void)
2
{
3
    while (!(UCSRA & (1<<RXC)))   // warten bis Zeichen verfuegbar
4
        ;
5
    return UDR;                   // Zeichen aus UDR an Aufrufer zurueckgeben
6
}
7
 
8
void uart_gets( char* Buffer, uint8_t MaxLen )
9
{
10
  uint8_t NextChar;
11
  uint8_t StringLen = 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

von t.b.d. (Gast)


Lesenswert?

...

char anzeigea[17];
char anzeigeb[17];
char chr_Character;
char u8_BufferNextIn;

...

u8_BufferNextIn=0;
do{
chr_Character=uart_getc();
if(u8_BufferNextIn<(sizeof(anzeigea)-1))
{
anzeigea[u8_BufferNextIn]=chr_Character;
u8_BufferNextIn++;
}
char anzeigeb[u8_BufferNextIn]=0;
}while(chr_Character<'\n')

...

u8_BufferNextIn=0;
do{
chr_Character=uart_getc();
if(u8_BufferNextIn<sizeof(anzeigeb)-1)
{
anzeigeb[u8_BufferNextIn]=chr_Character;
u8_BufferNextIn++;
}
char anzeigeb[u8_BufferNextIn]=0;
}while(chr_Character<'\n')


...

do{
janein=uart_getc();
}while(janein!=1);
lcd_string(clear);
set_cursor(0,2);
lcd_string(clear);

...

von Steffen (Gast)


Lesenswert?

Ok, ich hab jetzt mal das Programm entsprechend zusammenkopiert :-)
1
#include<avr/io.h>
2
#include<avr/interrupt.h>
3
#include<stdlib.h>
4
5
#include"uart.h"
6
#include"lcd-routines.h"
7
8
#ifndef F_CPU
9
#define F_CPU 4000000
10
#endif
11
12
#define UART_BAUD_RATE 9600
13
14
int main(void) 
15
{
16
char anzeigea[17];
17
char anzeigeb[17];
18
char chr_Character;
19
char u8_BufferNextIn;
20
int janein
21
22
uart_init(UART_BAUD_SELECT(UART_BAUD_RATE,F_CPU));
23
sei();
24
lcd_init();
25
while(1){
26
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
char anzeigeb[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
char anzeigeb[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

von risu (Gast)


Lesenswert?

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

von risu (Gast)


Lesenswert?

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

von Steffen (Gast)


Lesenswert?

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
char anzeigea [u8_BufferNextIn]=0;
2
char anzeigeb [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

von Jörg X. (Gast)


Lesenswert?

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

von Steffen (Gast)


Lesenswert?

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

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.