mikrocontroller.net

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


Autor: Steffen (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
ich hab folgendes Programm geschrieben, welches einen String, der über 
UART kommt auf einem LCD darstellen soll:
#include<avr/io.h>
#include<avr/interrupt.h>
#include<stdlib.h>

#include"uart.h"
#include"lcd-routines.h"

#ifndef F_CPU
#define F_CPU 4000000
#endif

#define UART_BAUD_RATE 9600

int main(void) 
{
char anzeigea[16];
char anzeigeb[16];
char clear[16];
int janein=0;

uart_init(UART_BAUT_SELECT(UART_BAUD_RATE,F_CPU));
sei();
lcd_init();
while(1){
uart_puts("Dieses Programm schreibt Zeichen die per UART kommen auf das Display");
lcd_string("Programmbeschrei");
set_cursor(0,2);
lcd_string("bung siehe UART");
uart_puts("Bitte nun den gewüschten Text für Zeile 1 eintippen: (ACHTUNG: Das Display kann pro Zeile nur 16 Zeichen darstellen)");
anzeigea=uart_gets();
lcd_string(anzeigea);
uart_puts("Bitte nun den gewüschten Text für Zeile 2 eintippen:");
anzeigeb=uart_gets();
set_cursor(0,2);
lcd_string(anzeigeb);
uart_puts("Soll das Display geloescht werden, um neue Zeichen anzuzeigen: (Für Ja=1, und für Nein=2)");
janein=uart_getc();
if (janein==1)
{
lcd_string(clear);
set_cursor(0,2);
lcd_string(clear);
}
else
{}
}
}

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:
anzeigea=uart_gets();

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

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
1)
UART_BAUT_SELECT -> UART_BAUD_SELECT

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

Autor: Steffen (Gast)
Datum:

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

Autor: Steffen (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Weiß niemand, wie man das Problem beheben kann?
Gruß, Steffen

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du musst erstmal eine Funktion schreiben, die einen String einliest.

Autor: Steffen (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
uint8_t uart_getc(void)
{
    while (!(UCSRA & (1<<RXC)))   // warten bis Zeichen verfuegbar
        ;
    return UDR;                   // Zeichen aus UDR an Aufrufer zurueckgeben
}
 
void uart_gets( char* Buffer, uint8_t MaxLen )
{
  uint8_t NextChar;
  uint8_t StringLen = 0;
 
  NextChar = uart_getc();         // Warte auf und empfange das nächste Zeichen
 
                                  // Sammle solange Zeichen, bis:
                                  // * entweder das String Ende Zeichen kam
                                  // * oder das aufnehmende Array voll ist
  while( NextChar != '\n' && StringLen < MaxLen - 1 ) {
    *Buffer++ = NextChar;
    StringLen++;
    NextChar = uart_getc();
  }
 
                                  // Noch ein '\0' anhängen um einen Standard
                                  // C-String daraus zu machen
  *Buffer = '\0';
}

Brauch ich das alles, um einen String einzulesen?
Vielen Dank schon mal für eure Hilfe!!!!
Gruß, Steffen

Autor: t.b.d. (Gast)
Datum:

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

...

Autor: Steffen (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ok, ich hab jetzt mal das Programm entsprechend zusammenkopiert :-)
#include<avr/io.h>
#include<avr/interrupt.h>
#include<stdlib.h>

#include"uart.h"
#include"lcd-routines.h"

#ifndef F_CPU
#define F_CPU 4000000
#endif

#define UART_BAUD_RATE 9600

int main(void) 
{
char anzeigea[17];
char anzeigeb[17];
char chr_Character;
char u8_BufferNextIn;
int janein

uart_init(UART_BAUD_SELECT(UART_BAUD_RATE,F_CPU));
sei();
lcd_init();
while(1){
uart_puts("Dieses Programm schreibt Zeichen die per UART kommen auf das Display");
lcd_string("Programmbeschrei");
set_cursor(0,2);
lcd_string("bung siehe UART");
uart_puts("Bitte nun den gewüschten Text für Zeile 1 eintippen: (ACHTUNG: Das Display kann pro Zeile nur 16 Zeichen darstellen)");
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')

lcd_string(anzeigea);
uart_puts("Bitte nun den gewüschten Text für Zeile 2 eintippen:");
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')

set_cursor(0,2);
lcd_string(anzeigeb);
uart_puts("Soll das Display geloescht werden, um neue Zeichen anzuzeigen: (Für Ja=1, und für Nein=2)");

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

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

Autor: risu (Gast)
Datum:

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

Autor: risu (Gast)
Datum:

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

Autor: Steffen (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
char anzeigea [u8_BufferNextIn]=0;
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

Autor: Jörg X. (Gast)
Datum:

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

Autor: Steffen (Gast)
Datum:

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

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.