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
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
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?
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
Und noch einmal ein Versuch: Vieleicht möchte mir ja heute jemand bei dieser Sache helfen, das wäre schön. Gruss, Mark
Welche Compilerversion benutzt du? In diesem Bereich hat es Weihnachten/Frühjahr rum eine Änderung gegeben.
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.
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.
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
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.
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.