Forum: Mikrocontroller und Digitale Elektronik UART stdio


von Mark (Gast)


Angehängte Dateien:

Lesenswert?

Hallo!

Brauche dringend Hilfe. Habe es bisher noch nie geschafft die Funktion
printf zu verwenden. Habe mir im Forum schon einige andere Beiträge
angesehen, kriege es aber einfach nicht hin. Hoffe sehr, dass mir
hierbei jemand helfen kann, diese Sache fängt so langsam an richtig zu
nerven.
Im Anhang habe ich mein makefile mitgesendet. Vieleicht liegt es ja
auch an diesen Einstellungen. Ansosnten habe ich in main.h die stdio.h
mit einbezogen.
Habe das ganze mit WINAVR programmiert.

Hier ein kleiner Ausschnitt aus meinem Quellcode:

int uart_putc(unsigned char c)
{
while (!(UCSRA & (1<<UDRE))); // warten bis Senden moeglich
UDR = c;                      // sende Zeichen
return 0;
}
fdevopen(uart_putc, NULL, 0);
printf("Hallo");

Und das Ergebnis: Es funktioniert gar nix und der Compiler gibt mir
folgende Fehlermeldungen:

main.c:40: Warnung: Verarbeiten des Argumentes 1 von »fdevopen« von
inkompatiblem Zeigertyp
main.c:40: Fehler: zu viele Argumente für Funktion »fdevopen«
main.c:48: durch frühere Fehler verwirrt, Abbruch

Die Zeile main.c:40: ist die Zeile mit der Funktion fdevopen(). Die
Funktion ist nach meinen Erkenntissen dafür da, dass printf gesagt
wird, an welche Funktion die enstandenen Zeichen gegeben werden sollen?
Ich muss gestehen, dass ich keine wirklich fundierten c-Kenntnisse habe,
es ist aber komisch, dass mein Code sehr ähnlich zu dem aus dem Beispiel
des Tutorials von mikrocontroller.net ist und es diese Fehlermeldungen
gibt.

Ich wäre sehr dankbar, wenn mir jemand helfen würde, dieses Problem zu
lösen, wie gesagt, das nervt langsam.

Gruss, Mark

von Martin S. (emsystech)


Lesenswert?

Hallo Mark,

prinzipiell auch im Tutorial zu finden:
http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial

*********************

#include <inttypes.h>
#include <stdio.h>
#include <stdint.h>

static int uart_putchar(char c, FILE *stream);

static FILE mystdout = FDEV_SETUP_STREAM(uart_putchar,
NULL,_FDEV_SETUP_WRITE);

static int uart_putchar(char c, FILE *stream)
{
    while ( !( UCSRA & (1<<UDRE)) );
  UDR = c;
    return 0;
}

*********************

printf("Dann klappts auch mit dem printf\r\n");

Gruß, Martin

von Mark (Gast)


Lesenswert?

Wenn ich das so eingebe, hatte in der Library einen sehr ähnlichen code
gefunden, meckert der compiler:

main.c:31: interner Compiler-Fehler: output_operand: ungültiger
Ausdruck als Operand


main.c:31 bezieht sich auf static FILE mystdout =
FDEV_SETUP_STREAM(uart_putchar,
NULL,_FDEV_SETUP_WRITE);


Woran liegt das?

von Mark (Gast)


Lesenswert?

Hi!

Hatte gestern diesen Beitrag in das Forum geschrieben. Habe schon
einmal oben Antwort bekommen, es funktioniert jedoch immer noch nichts.
Da hier sehr viele Beiträge in das Forum kommen starte ich schon wieder
einen Aufruf, nicht dass mein Problem in vergessen wird.

Weiss nicht woran das liegt, warum der compiler immer meckert. Bin bei
dieser Sache langsam am verzweifeln und hoffe, dass mir hierbei doch
noch jemand helfen kann. Es will einfach nicht funktionieren.

Mark

von Mark (Gast)


Lesenswert?

Kann mir bei der Sache etwa niemand mal helfen?

von Mark (Gast)


Lesenswert?

Und noch einmal ein Versuch:

Vieleicht möchte mir ja heute jemand bei dieser Sache helfen, das wäre
schön.

Gruss, Mark

von Karl heinz B. (kbucheg)


Lesenswert?

Welche Compilerversion benutzt du?
In diesem Bereich hat es Weihnachten/Frühjahr rum
eine Änderung gegeben.

von Karl heinz B. (kbucheg)


Lesenswert?

Zumindest das hier

#include <inttypes.h>
#include <stdio.h>
#include <stdint.h>
#include <avr/io.h>

static int uart_putchar(char c, FILE *stream);

static FILE mystdout = FDEV_SETUP_STREAM(uart_putchar,
NULL,_FDEV_SETUP_WRITE);

static int uart_putchar(char c, FILE *stream)
{
    while ( !( UCSRA & (1<<UDRE)) );
  UDR = c;
    return 0;
}

int main()
{
  stdout = &mystdout;
  printf("Dann klappts auch mit dem printf\r\n");
}

kompiliert ohne Probleme. Laufen wirds nicht, da die
UART nirgends initialisiert wird. Aber das ist ein anderes
Problem.

von Mark (Gast)


Lesenswert?

Bin recht neu dabei.

Habe das von Karl Heinz Buchegger gerade noch mal compiliert. Das geht
auch nicht.

Zu:
static FILE mystdout = FDEV_SETUP_STREAM(uart_putchar,
NULL,_FDEV_SETUP_WRITE);

sagt der compiler:
main.c:40: internal compiler error: output_operand: invalid expression
as operand

Benutzte WINAVR, habe mir gestern die neuste Installationsdatei noch
mal runtergeladen. Da ist doch ein Compiler dabei? Frage nur, da ich
vorher schon andere Tools installiert hatte, könnte ja sein, dass
WINAVR davon noch etwas mitverwendet? Finde nur gerade leider nicht,
welche Version das genau ist. Wo finde ich das?

Aber vieleicht hilft das. Wenn ich fdevopen verwende wie in den meisten
Beispielen mit fdevopen(put..., NULL, 0), dann meckert der compiler,
dass ich zu viele Argumente übergeben habe.

Wie man merkt, komme ich mit diesen Tools noch nicht so ganz klar, so
ist es auch mit dem makefile, habe es deswegen oben mitgesendet.

von Mark (Gast)


Angehängte Dateien:

Lesenswert?

Sorry, wenn ich so hartneckig bin, möchte dieses Problem nur gerne
lösen, das bremst meine Sache zur Zeit total aus.

Sende jetzt den Auszug aus meinem Projekt mit, mit dem ich
Schwierigkeiten habe. Wenn ich es so compiliere wie es jetzt ist, ist
alles in Ordnung. Wenn ich in main.c den Auskommentierten Bereich
(entspricht jetzt dem von Karl Heinz Buchegger), dann meckert der
compiler.
UARTinit für UART initialisierung (kann senden und empfangen,
funktioniert auch)
Mit dem makefile bin ich mir auch nicht so sicher, ob da alles ok ist.

Wäre super, wenn es jemand mal kompilieren könnte, vieleicht liegt es
ja wirklich an meiner verwendeten Programmiersoftware.
Wichtig: das auskommentierte in main.c.

Mark

von Karl H. (kbuchegg)


Lesenswert?

Manchmal fragt man sich schon.
Damacht man sich die Mühe und baut ein komplettes
Beispiel, dass der Fragesteller einfach nur so wie
es ist per Cut&Paste in ein neues Projekt übernehmen
soll um damit was abzuklären.

Aber glaubst du die wprden das machen. Nein. Das geht
dann stundenlang so dahin, bis es jemandem zu bloed
wird und er vom Fragesteloler das Projekt anfordert.
Und da stellt sich dann raus, das der Fragesteller wieder
mal ganz was anderes gemacht hat und die läppischten und
primitivsten C-Fehler macht.

Kauf dir ein Buch über C. Das was du da auskommentiert hast
strotzt nur so vor Verstössen gegen die Sprachregeln.
Das kann ich dir jetzt auch nicht erklären ohne zu einem
20 Seiten Rundumschlag auszuholen und dazu hab ich ehrlich
gesagt keine Lust.

von Karl H. (kbuchegg)


Lesenswert?

Dein main.c muss so aussehen:


#include "main.h"

static int uart_putchar(char c, FILE *stream);
static FILE mystdout = FDEV_SETUP_STREAM
                   (uart_putchar,NULL,_FDEV_SETUP_WRITE);

static int uart_putchar(char c, FILE *stream)
{
  while ( !( UCSRA & (1<<UDRE)) )
    ;
  UDR = c;
  return 0;
}


int main(void)
{
  IOINIT_init();

  PORTD = PORTD & 239; /* Setze PD5 auf 0, damit grüne LED leuchtet*/

  UART_init();


  UDR = 0x31;


  stdout = &mystdout;
  printf("Dann klappts auch mit dem printf\r\n");

  while( 1 )
    ;
}

nimms einfach und kopiere es über dein main.c drüber.
Und kauf dir ein C-Buch und arbeite da mal die ersten
Kapitel durch.

von Mark (Gast)


Lesenswert?

Vielen Dank,

dass war jetzt wirklich eine große Hilfe. Jetzt hab ichs auch gesehen.
Habe vieleicht noch andere Fehler gesehen, aber die schlimmsten waren,
dass ich eine Funktion in einer anderen deklariert habe, dass ist mir
vorher auch nicht passiert, es ist mir aber vorher nie aufgefallen,
einfach nicht gesehen.

Also nochmal, vielen dank. Das Thema wäre geklärt. Und c werde ich mir
bestimmt noch mal näher ansehen.

Mark

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.