Forum: Compiler & IDEs xmega scanf gcc nutzbar machen


von Peter M. (saarbrigger128)


Lesenswert?

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

von Peter M. (saarbrigger128)


Lesenswert?

...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));
}

//---------------------------------------------------------------------- 
----

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

"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.

von Peter M. (saarbrigger128)


Lesenswert?

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

von Peter M. (saarbrigger128)


Lesenswert?

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
Noch kein Account? Hier anmelden.