mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik UART stdio


Autor: Mark (Gast)
Datum:
Angehängte Dateien:

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

Autor: Martin Steppuhn (emsystech)
Datum:

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

Autor: Mark (Gast)
Datum:

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

Autor: Mark (Gast)
Datum:

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

Autor: Mark (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Kann mir bei der Sache etwa niemand mal helfen?

Autor: Mark (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Und noch einmal ein Versuch:

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

Gruss, Mark

Autor: Karl heinz Buchegger (kbucheg)
Datum:

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

Autor: Karl heinz Buchegger (kbucheg)
Datum:

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

Autor: Mark (Gast)
Datum:

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

Autor: Mark (Gast)
Datum:
Angehängte Dateien:

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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

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

Autor: Mark (Gast)
Datum:

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

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.