Eingabe über Terminal + Ausgabe dieser Eingabe!

OP #2087375
Lesenswert?

Hallo!

Folgendes Programm:

#include <stdio.h>

#include <mc912d128.h>

#define RDRF 0x20
#define TDRE 0x80

char sci0_getc(void){
   while ((SC0SR1 & RDRF) == 0);
   return(SC0DRL);
}

// Achtung keine Überprüfung der Buffer-Länge!
char sci0_gets(char *buffer){
  char len=0;
  do{
    *buffer = sci0_getc();
    len++;
  }while(*buffer++ != '\n');
  *buffer = '\0'; //Terminierung
  return len;
}

void sci0_init(void){
    SC0BDH=0;
    SC0BDL=26;
    SC0CR1=0;
    SC0CR2=0x0C; //TE+RE enable
}

void sci0_putc(char data){
   while ((SC0SR1 & TDRE) == 0){};
   SC0DRL = data;
}

void sci0_puts(char* data){
   while (*data)
       sci0_putc(*data++);
}


int main(){
  char *str_buffer[64];

  sci0_init();

  sci0_puts("Bitte String eingeben:");
  sci0_gets(*str_buffer);
  sci0_puts("Die Eingabe lautet:\n");
  sci0_puts(*str_buffer);
  while(1);
}


Läuft bis "Bitte String eingeben: " aber nicht weiter!!

Kann also so wie ich es sehe, nichts eingeben und gibt mir auch meine 
Eingabe nicht wieder aus.


Wisst ihr wo der Fehler liegt? ICC12 gibt keine Fehlermeldung aus!


THX schonmal!!! ;)
Gast #2087378
Lesenswert?

Ohne genau geschaut zu haben:
>char *str_buffer[64];
>sci0_gets(*str_buffer);
ist zu 99,9% Müll. Nimm mal die Sterne da weg.

Und HerrgottSakramentNochmal schreibt euren C-Code doch mal in [ c] [/ 
c] Tags!
OP #2087432
Lesenswert?

Neu:

#include <stdio.h>

#include <mc912d128.h>

#define RDRF 0x20
#define TDRE 0x80

char sci0_getc(void){
   while ((SC0SR1 & RDRF) == 0);
   return(SC0DRL);
}

// Achtung keine Überprüfung der Buffer-Länge!
char sci0_gets(char *buffer){
  char len=0;
  do{
    *buffer = sci0_getc();
    len++;
  }while(*buffer++ != '\n');
  *buffer = '\0'; //Terminierung
  return len;
}

void sci0_init(void){
    SC0BDH=0;
    SC0BDL=26;
    SC0CR1=0;
    SC0CR2=0x0C; //TE+RE enable
}

void sci0_putc(char data){
   while ((SC0SR1 & TDRE) == 0){};
   SC0DRL = data;
}

void sci0_puts(char* data){
   while (*data)
       sci0_putc(*data++);
}


int main(){
  char str_buffer[64];

  sci0_init();

  sci0_puts("Bitte String eingeben:");
  sci0_gets(str_buffer);
  sci0_puts("Die Eingabe lautet:\n");
  sci0_puts(str_buffer);
  while(1);
}

Geht aber immer noch net... selbes Problem!!! :(

THX!
Gast #2087434
Lesenswert?

Steht direkt über dem Antwortfenster:

Formatierung (mehr Informationen...)

    * [c ]C-Code[ /c] <-----DAAAAAAA
    * [avrasm ]AVR-Assembler-Code[ /avrasm]
    * [ code]Code in anderen Sprachen, ASCII-Zeichnungen[ /code]
    * [ math]Formel in LaTeX-Syntax[ /math]
    * [ [ Titel]] - Link zu Artikel

Also
[ c]
---Hier steht Code----
[ /c]

(natürlich OHNE LEERZEICHEN bei [ c] und [ /c])
Gast #2087471
Lesenswert?

Diese Eingabeschleife in sci0_gets
1
  do{
2
    *buffer = sci0_getc();
3
    len++;
4
  }while(*buffer++ != '\n');

wird nur verlassen, wenn du ein '\n' empfängst. Sendet die Gegenseite 
ein '\n'?

Anm.: Die Eingabeschleife bzw. sci0_gets ist auch 100% Buffer Overflow 
kompatibel.
OP #2087501
Lesenswert?

Helfer schrieb:
> Diese Eingabeschleife in sci0_gets
>
>
1
>   do{
2
>     *buffer = sci0_getc();
3
>     len++;
4
>   }while(*buffer++ != '\n');
5
>
>
> wird nur verlassen, wenn du ein '\n' empfängst. Sendet die Gegenseite
> ein '\n'?
>
> Anm.: Die Eingabeschleife bzw. sci0_gets ist auch 100% Buffer Overflow
> kompatibel.

Ja wenn ich etwas versuche einzugeben erscheint das gar nicht im 
Terminal! Ich weiß auch nicht ob da ein "\n" kommt???

Wie könnte ich das herausfinden??

THX!!!
Gast #2087705
Lesenswert?

> Ja wenn ich etwas versuche einzugeben erscheint das gar nicht im
> Terminal!

Dann erzeuge ein Echo für deine Eingabe. Das kannst du lokal auf dem 
Sender erzeugen (Programmeinstellung Terminalprogramm) oder auf dem 
Empfänger (mc912d128). Die zweite Variante ist besser, weil du den 
tatsächlichen Datenverkehr mitloggen kannst und das Logfile auswerten 
kannst.
1
  do{
2
    *buffer = sci0_getc();
3
    sci0_getc(*buffer);    // Echo
4
    len++;
5
  }while(*buffer++ != '\n');
Gast #2088593
Lesenswert?

Anscheinend kommt die Eingabe eines '\n' nicht und daher wird die 
do-while Schleife nicht verlassen.

Hast du einen Mitschnitt der übertragenen Zeichen gemacht?

Diesen Mitschnitt könnte man sich mit dem Hexeditor ansehen und 
ermitteln, ob du ein Zeilenende/Eingabeende nach dem "hallo" gesendet 
hast und auf welches Zeichen dann abzufragen ist.

Ich vermute es ist das CR = '\r' Zeichen, das mit der RETURN-Taste 
gesendet wurde.

Du kannst eine Debugausgabe einfügen und die Bedingung entsprechend 
ändern:

[C]
  do{
    *buffer = sci0_getc();
    len++;
#if 1
    // Zeilenende debuggen
    switch (*buffer) {
      case '\n':
        sci0_puts("\\n"); // LF Linefeed
        break;
      case '\r':
        sci0_puts("\\r"); // CR Carriage return
        break;
      default:
        sci0_putc(*buffer);  // Echo
        break;
    }
#endif
  } while(*buffer++ != '\n' || *buffer++ != '\r');
[\C]
OP #2088598
Lesenswert?

NurEinGast schrieb:
> Probiere doch einfach mal
>
> anstatt   (*buffer++ != '\n')
> aus, ob bei  (*buffer++ != 'o')
>
> nach Eingabe des "hallo" die Schleife verlassen wird.
>
> Dann weisst Du schon mal, ob es am \n liegt.

Ja liegt daran :(

jetzt kommt das heraus:

 4000...Bitte String eingeben:halloDie Eingabe lautet:
       hallo

Wie kann ich das nur machen, dass wenn ich die Eingabe drücke die 
nächste Zeile erst kommt? Bzw die Ausgabe???

THX!!
OP #2088609
Lesenswert?

Ich habs!!!!

1
#include <stdio.h>
2

3
#include <mc912d128.h>
4

5
#define RDRF 0x20
6
#define TDRE 0x80  
7

8
char sci0_getc(void){
9
   while ((SC0SR1 & RDRF) == 0);
10
   return(SC0DRL);
11
}
12

13
// Achtung keine Überprüfung der Buffer-Länge!
14
char sci0_gets(char *buffer){
15
  char len=0;
16
  do{
17
    *buffer = sci0_getc();
18
  sci0_putc(*buffer);    // Echo
19
    len++;
20
  }while(*buffer++ != '\r');
21
  *buffer = '\0'; //Terminierung
22
  return len;
23
}
24

25
void sci0_init(void){
26
    SC0BDH=0;  
27
    SC0BDL=26; 
28
    SC0CR1=0;
29
    SC0CR2=0x0C; //TE+RE enable
30
}
31

32
void sci0_putc(char data){
33
   while ((SC0SR1 & TDRE) == 0){};
34
   SC0DRL = data;
35
}
36

37
void sci0_puts(char* data){
38
   while (*data)
39
       sci0_putc(*data++);
40
}
41

42

43
int main(){
44
  char str_buffer[64];
45
  
46
  sci0_init();
47

48
  sci0_puts("Bitte String eingeben:");
49
  sci0_gets(str_buffer);
50
  sci0_puts("\nDie Eingabe lautet: ");
51
  sci0_puts(str_buffer);
52
  while(1);
53
}

freu

THX an alle!!!

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