xmega scanf gcc nutzbar machen

OP #5490311
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
OP #5490326
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));
}

//---------------------------------------------------------------------- 
----
Moderator Persönliche Seite #5491555
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.
OP #5491681
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
OP #5491723
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...

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren