Hallo, aus den Beiträgen, hier im Forum, kann ich schon printf benutzen. (Danke) https://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#Die_Nutzung_von_sprintf_und_printf Das füge ich mit "include uart_putchar.h" in meinen Projecten ein. Als "Anfänger" reicht mir das. Hauptsache es funktioniert. #ifndef UART_PUTCHAR_H #define UART_PUTCHAR_H #include <avr/io.h> #include <stdio.h> #include <stdint.h> //---------------------------------------------------------------------- ------------------- // damit geht dann auch "printf" // C:\Program Files (x86)\Atmel\Studio\7.0\toolchain\avr8\avr8-gnu-toolchain\avr\include\std io.h // // im main() muss noch "stdout=$mystdout" eingefügt werden // // und die USART-Struktur die verwand wird, muss bekannt gemancht werden // #define CON_UART &USARTE0 // //---------------------------------------------------------------------- ------------------- 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) { if (c == '\n') uart_putchar( '\r', stream); fkt_uart_putc( CON_UART, c ); // eigener xmega char senden return 0; } //---------------------------------------------------------------------- ------------------- #endif /* UART_PUTCHAR_H */ So ähnlich müsste das doch auch für die Eingabe gehen, damit man scanf nutzen kann. Bin aber selber nicht in der Lage, die nötigen Korrekturen zu machen. Da hoffe ich auf eure Hilfe, wie das ganze für "stdin" dann aussieht. Danke. Gruß Peter
...hab's doch hinbekommen... entsprechend im main() noch die Zuweisung: stdin =$mystdin; ...und scanf richtig bedienen... //---------------------------------------------------------------------- ---- static int uart_getchar( FILE *stream); static FILE mystdin = FDEV_SETUP_STREAM(NULL, uart_getchar, _FDEV_SETUP_READ); static int uart_getchar(FILE *stream) { return (fkt_uart_getc( CON_UART)); } //---------------------------------------------------------------------- ----
"Nacktes" scanf() würde ich an deiner Stelle übrigens nicht benutzen. Es ist ziemlich grottig, da aus irgendeinem Fehlerzustand (scanf brach ab, weil irgendein Zeichen im Eingabestrom nicht auf das Format gepasst hat) sinnvoll wieder zu synchronisieren. Besser ist es, zeilenweise Daten zu lesen (oder mit irgendeinem anderen Trennzeichen deiner Weil, zeilenweise geht halt einfach mit fgets()) und dann sscanf() zu benutzen.
Danke, habe es schon gemerkt... ZB. bei %d => 6-ziffern eingegeben, kommt mist raus. Beim 128A3U und JTAG/Dragon mit Studio-7 schaltet die CPU-Clock um und das debugen am USART geht nicht mehr. Bzw. es passieren ganz merkwürdige Dinge. Wäre dann der Aufruf so ?? fgets( buffer, buffersize, stdin); Ein "echo" der Char Eingabe müsste dann im "uart_getchar" realisiert werden?? Gruß Peter
fgets war eine guter Hinweis... Da sieht man noch die Zeichen im "inp_buf" und das debuggen klappt auch. Einschliesslich das LF(0x0a)für das beenden der Eingabe. while(1) { printf("input:"); fgets( inp_buf, buf_size, stdin) ; printf("\rbuf=%s\n", inp_buf); cou=sscanf(inp_buf, "%d %d %d", &z1, &z2, &z3); printf("cou=0x%x z1=0x%x z2=0x%x z3=0x%x\n", cou, z1, z2, z3); } Gruß Peter PS: aller Anfang ist schwer...
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.