www.mikrocontroller.net

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


Autor: J. R. (cia_man)
Datum:

Bewertung
0 lesenswert
nicht 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!!! ;)

Autor: ga (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: J. R. (cia_man)
Datum:

Bewertung
0 lesenswert
nicht 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???

Autor: J. R. (cia_man)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: gaga (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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])

Autor: J. R. (cia_man)
Datum:

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

Autor: Helfer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Diese Eingabeschleife in sci0_gets
  do{
    *buffer = sci0_getc();
    len++;
  }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.

Autor: J. R. (cia_man)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Helfer schrieb:
> Diese Eingabeschleife in sci0_gets
>
>
>   do{
>     *buffer = sci0_getc();
>     len++;
>   }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.

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

Autor: J. R. (cia_man)
Datum:

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

THX!!!

Autor: Helfer (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.
  do{
    *buffer = sci0_getc();
    sci0_getc(*buffer);    // Echo
    len++;
  }while(*buffer++ != '\n');

Autor: Helfer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mist, Copy&Paste, sci0_putc heisst das Ding :)
  do{
    *buffer = sci0_getc();
    sci0_putc(*buffer);    // Echo
    len++;
  }while(*buffer++ != '\n');

Autor: J. R. (cia_man)
Datum:

Bewertung
0 lesenswert
nicht 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!!!

Autor: jonas biensack (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Welches Terminal programm?

Autor: J. R. (cia_man)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
jonas biensack schrieb:
> Welches Terminal programm?

Das vom ICC12!

THX!!!

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

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

Autor: J. R. (cia_man)
Datum:

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

hallo + Eingabe!

Autor: NurEinGast (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Serieller (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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]

Autor: J. R. (cia_man)
Datum:

Bewertung
0 lesenswert
nicht 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!!

Autor: J. R. (cia_man)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das geht: while(*buffer++ != '\r');

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


g4000
DieEingabelautet:tteStringeingeben:hallo
                   hallo


:(

THX!!!

Autor: J. R. (cia_man)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habs!!!!


#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();
  sci0_putc(*buffer);    // Echo
    len++;
  }while(*buffer++ != '\r');
  *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("\nDie Eingabe lautet: ");
  sci0_puts(str_buffer);
  while(1);
}


freu

THX an alle!!!

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.