Forum: Mikrocontroller und Digitale Elektronik Eingabe über Terminal + Ausgabe dieser Eingabe!


von J. R. (cia_man)


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!!! ;)

von ga (Gast)


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!

von J. R. (cia_man)


Lesenswert?

ga schrieb:
> 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!

Was heißt des mit den tags???

von J. R. (cia_man)


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!

von gaga (Gast)


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])

von J. R. (cia_man)


Lesenswert?

Okay! Sorry hab ich net gewusst! :( Aber weiß denn niemand was zum 
Problem??

von Helfer (Gast)


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.

von J. R. (cia_man)


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!!!

von J. R. (cia_man)


Lesenswert?

Kann mir denn niemand bei dem Problem helfen? Wäre jedenfalls gut wenn 
;)

THX!!!

von Helfer (Gast)


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');

von Helfer (Gast)


Lesenswert?

Mist, Copy&Paste, sci0_putc heisst das Ding :)
1
  do{
2
    *buffer = sci0_getc();
3
    sci0_putc(*buffer);    // Echo
4
    len++;
5
  }while(*buffer++ != '\n');

von J. R. (cia_man)


Lesenswert?

Hallo!

Hab die obere Zeile fürs Echo eingefügt!

Nun zeigt es zwar an was ich eingebe, aber es kommt dennoch keine 
Ausgabe???

Executing 4000...Bitte String eingeben:hallo


Weiter läuft es nicht :<

THX!!!

von jonas biensack (Gast)


Lesenswert?

Welches Terminal programm?

von J. R. (cia_man)


Lesenswert?

jonas biensack schrieb:
> Welches Terminal programm?

Das vom ICC12!

THX!!!

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Und wie gibst Du Deinen String ein? Welche Tasten drückst Du auf der 
Tastatur?

von J. R. (cia_man)


Lesenswert?

Rufus Τ. Firefly schrieb:
> Und wie gibst Du Deinen String ein? Welche Tasten drückst Du auf der
> Tastatur?

hallo + Eingabe!

von NurEinGast (Gast)


Lesenswert?

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.

von Serieller (Gast)


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]

von J. R. (cia_man)


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!!

von J. R. (cia_man)


Lesenswert?

Das geht: while(*buffer++ != '\r');

jedoch sieht die Ausgabe wieder etwas komisch aus....


g4000
DieEingabelautet:tteStringeingeben:hallo
                   hallo


:(

THX!!!

von J. R. (cia_man)


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!!!

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.