sscanf, printf und stdout, stdin

OP #1109328
Lesenswert?

Hi,

ich benutzte WinAVR und einen ATmega32.
Habe seit gestern die printf-Ausgabe geschaft -> stdout richtig 
umgeleitet. Nun will ich in der "while(1)"-Schleife innerhalb der ersten 
2s abfragen ob ein 'h' über die USART geschickt wird (Timer funktioniert 
über COMPARE-ISR ohne Probleme).
Ich habe versucht:

static FILE mystdout = FDEV_SETUP_STREAM( uart_putchar, NULL, 
_FDEV_SETUP_WRITE );

//TIMER-ISR bei Überlauf, SET MODE -> N

int main(void)
{
  stdout = stdin = &mystdout;
        char IN;
.
.
        while(1)
        {
          sscanf(stdin, "%c", &IN);
          if (IN== 'h')
            //STOP TIMER, SET MODE -> H
          .
          .
          .
        }
.
.
.

Mein Problem ist jetzt: Der Timer läuft in die ISR obwohl die Eingabe 
innerhalb der Zeit erfolgt.

Danke schon mal im vorraus
OP #1112147
Lesenswert?

Hi,

danke für die Antwort. So, wie ich deinen Text verstehe würde es nun in 
etwa so aussehen ...

************************************************************************ 
*****
...

char Command[10];

...

fgets(Command,10,stdin);
sscanf(Command,"Akt. Zeit eingeben: 2x 2x 2x", hours, minutes, seconds);

...
************************************************************************ 
*****

... für die Eingabe der Zeit? Im konrekten geht es mir nämlich um das 
Einlesen der Uhrzeit um sie an die RTC (PCF8583) weiterzuschicken.

Danke!
#1112544
Lesenswert?

Erwartest du wirklich, dass dein Benutzer eintippt

"Aktuelle Zeit eingeben: 12 23 50"

fgets holt einen String von stdin und sscanf zerlegt ihn in Einzelteile.
Wenn du vorher eine Eingabeaufforderung dort stehen haben willst, dann 
musst du die voerher mit printf ausgeben. Dein Benutzer wird die nicht 
für dich eingeben.

Schau dir nochmal die Umleitung deiner Streams an.

  stdout = stdin = &mystdout;

Aha, beide Standardstreams, stdout und stdin, laufen also über mystdout.

static FILE mystdout = FDEV_SETUP_STREAM( uart_putchar, NULL,
_FDEV_SETUP_WRITE );



Ooops. Wie bitte soll den von diesem Stream gelesen werden, wenn der 
Stream nur eine Funktion uart_putchar hat, welche, dem Namen nach zu 
urteilen, lediglich ein einzelnes Zeichen ausgeben, also schreiben 
kann.


Ganz ehrlich?
Vergiss den ganzen Quatsch mit der Stream Umleiterei. Das ist den 
Aufwand so nicht wert. Hol dir vom Fleury die UART Lib, damit wirst du 
glücklicher, als wie wenn du printf und scanf oder fgets benutzen 
kannst.
Moderator Persönliche Seite #1113134
Lesenswert?

Karl heinz Buchegger wrote:

> Vergiss den ganzen Quatsch mit der Stream Umleiterei. Das ist den
> Aufwand so nicht wert. Hol dir vom Fleury die UART Lib, damit wirst du
> glücklicher, als wie wenn du printf und scanf oder fgets benutzen
> kannst.

Wobei sich beides wohl nicht gegenseitig ausschließt, oder?  Man kann
stdin auf den Funktionen dieser Bibliothek aufsetzen.

Was ich aber generell (nicht nur auf einem AVR, auch auf einem PC)
nicht machen würde, ist scanf() direkt zu benutzen, ohne vorher die
Daten in einen Zeilenpuffer einzulesen.

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