gets problem

OP #942451
hallo,

ich möchte mit gets daten über die tastatur einlesen (datum und uhrzeit)

code hab ich vom tutorial:
1
uint8_t uart_getc(void)
2
{
3
    while (!(UCSRA & (1<<RXC)))   // warten bis Zeichen verfuegbar
4
        ;
5
    return UDR;                   // Zeichen aus UDR an Aufrufer zurueckgeben
6
}
7
 
8
void uart_gets( char* Buffer, uint8_t MaxLen )
9
{
10
  uint8_t NextChar;
11
  uint8_t StringLen = 0;
12
 
13
  NextChar = uart_getc();         // Warte auf und empfange das nächste Zeichen
14
 
15
                                  // Sammle solange Zeichen, bis:
16
                                  // * entweder das String Ende Zeichen kam
17
                                  // * oder das aufnehmende Array voll ist
18
  while( NextChar != '\n' && StringLen < MaxLen - 1 ) {
19
    *Buffer++ = NextChar;
20
    StringLen++;
21
    NextChar = uart_getc();
22
  }
23
                                 // Noch ein '\0' anhängen um einen Standard
24
                                  // C-String daraus zu machen
25
  *Buffer = '\0';
26
}
27
//zeit und datum einstellen (uart zuvor configurieren!)
28
void zeit_einstellen(void)
29
{
30
  myprintf("Datum? yy.mm.dd\n\r");
31

32
  uart_gets(zeittemp,9);
33

34
  y=(zeittemp[0]-'0')*10+(zeittemp[1]-'0');
35
  m=(zeittemp[3]-'0')*10+(zeittemp[4]-'0');
36
  d=(zeittemp[6]-'0')*10+(zeittemp[7]-'0');
37
  sprintf(zeittemp,"%2i:%2i:%2i",y,m,d);
38
  myprintf("%s",zeittemp);
39

40

41
  myprintf("\n\nZeit? hh:mm:ss\n\r");
42

43
  uart_gets(zeittemp,9);
44
  
45
  h=(zeittemp[0]-'0')*10+(zeittemp[1]-'0');
46
  min=(zeittemp[3]-'0')*10+(zeittemp[4]-'0');
47
  sek=(zeittemp[6]-'0')*10+(zeittemp[7]-'0');
48
  sek--;
49
  sprintf_P(zeittemp,PSTR("%2i:%2i:%2i"),h,min,sek);
50
  
51
  myprintf("%s",zeittemp);
52

53
  myprintf("\n\n");
54
}

zeittemp ist 19 Byte groß.

Epmpfang ist auch aktiviert:
#define UART0_CONFIGURE1    UCSRB= (1<<RXCIE) | (1<<TXCIE) | (1<<RXEN) | 
(1<<TXEN)

wird natürlich auch aufgerufen.

das problem ist, dass die eingabe nicht nach 9 zeichen stoppt, sondern 
erst nach 21 eingaben stoppt.

wie kann das sein?
OP
die (my)printf Funktion hab ich von holger klabunde

hab mir mal da genauer angeschaut.

der löste das mit transmit und receive interrupts.

kann das der Grund sein? Die UART-Schnittstelle ist auch auf das 
initialisiert.

Weiteres Problem:
Ich hab einen Timer1 overflow interrupt
zur kontrolle gib ich isr über die uart aus.

es wirt nur das "i" übermittelt, dann steckt der Controller.
kann das mit den UART-Interrupts zusammenhängen?

kann ich die uart interrupts irgendwie entfernen?

Was muss ich ändern das es geht?

Anlage:
serial
printf
von holger klabunde

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 18 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.