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!!! ;)
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!
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???
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!
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])
Okay! Sorry hab ich net gewusst! :( Aber weiß denn niemand was zum Problem??
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.
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!!!
Kann mir denn niemand bei dem Problem helfen? Wäre jedenfalls gut wenn ;) THX!!!
> 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'); |
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'); |
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!!!
Und wie gibst Du Deinen String ein? Welche Tasten drückst Du auf der Tastatur?
Rufus Τ. Firefly schrieb: > Und wie gibst Du Deinen String ein? Welche Tasten drückst Du auf der > Tastatur? hallo + Eingabe!
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.
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]
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!!
Das geht: while(*buffer++ != '\r'); jedoch sieht die Ausgabe wieder etwas komisch aus.... g4000 DieEingabelautet:tteStringeingeben:hallo hallo :( THX!!!
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.