www.mikrocontroller.net

Forum: Compiler & IDEs Eingabe eines Zeichens per RS232


Autor: M. I. (seventh_son)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

es gibt ja diese einfachen DOS-Fenster-Programme, in denen man ein 
Zeichen eingibt und wieder ausgibt. Das selbe möchte ich jetzt mit der 
RS232-Schnittstelle machen. stdin und stdout sind bereits an RS232-UART 
umgeleitet.

Habe es nun mit diesem Code versucht:

char c;

printf("Starting mytest");
c=getchar();
printf("%c", &c);

Läuft aber nicht. Der Debugger gibt "Starting mytest" aus, aber wenn ich 
über das Terminal ein Zeichen eingebe wird es nicht angezeigt. Getchar 
wartet doch auf eine Eingabe, bevor das Programm weiter läuft?

Gruß

seventh_son

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

Bewertung
0 lesenswert
nicht lesenswert
>
> printf("%c", &c);
>

Was soll das hier ausgeben? Die Adresse von 'c'? Dann ist %c falsch. 
Oder den Inhalt von 'c'? Dann ist das '&' wegzulassen.

Autor: Εrnst B✶ (ernst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Probier mal nach dem Zeicheneingeben noch Enter zu drücken.
getch liest vermutlich dein Zeichen korrekt aus, aber das printf danach 
puffert die Ausgabe, bis eine Zeile komplett ist...

oder alternativ mal mit

printf("%c\n", c);

Testen.

(&c ist übrigens falsch, du willst ja das zeichen ausgeben, und nicht 
die (statische) adresse wo's am Stack liegt.

/Ernst

Autor: M. I. (seventh_son)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Natürlich. Flüchtigkeitsfehler. thx

Autor: M. I. (seventh_son)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Ernst Bachmann

Habe dein zweites Beispiel versucht. Er gibt mir aber kein Zeichen aus.
Die new lines gibt er sehr wohl aus.

Der Debugger zeigt ebenfalls richtig an, dass das Programm vor Eingabe 
eines Zeichens quasi "steht", und danach springt er auf das Ende.

Autor: M. I. (seventh_son)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Möchte nochmal darauf hinweisen dass mein Problem trotz Behebung des 
"&-Fehlers" nicht gelöst ist ;)

Autor: M. I. (seventh_son)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Habe festgestellt, dass in der Variablen c nach Eingabe eines Zeichens 
zunächst das richtige Zeichen enthalten ist. Nach der printf-Anweisung 
ist allerdings ein Leerzeichen in der Variablen, welches auch ausgegeben 
wird. Wie kann das sein?

Autor: OliverSo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Möchte nochmal darauf hinweisen dass mein Problem trotz Behebung des
>"&-Fehlers" nicht gelöst ist ;)

Heul doch, oder lass es sein.

- Kommt printf("Hallo Welt") an?
- Gibt dein Progamm das Zeichen auf dem Bildschirm aus, wenn du stdout 
nicht umleitest?
- Was passiert, wenn du statt printf putchar verwendest?

Ausprobieren musst du das aber alles selber. Nicht, das du morgen hier 
drauaf hinweist, daß das immer noch keiner probiert hätte...

Oliver

Autor: M. I. (seventh_son)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Oliver

Lange keinen Sex gehabt?

1. Wenn du dir den Thread von Anfang an durchliest, stellst du fest: Ich 
habe nur nochmal darauf hingewiesen, weil man ja der Meinung sein konnte 
dass das Problem nach Beheben meines Flüchtigkeitsfehlers gelöst ist.

2. Ich probiere grade alles mögliche aus, ich warte sicher nicht darauf 
hier die ultimative Problemlösung zu bekommen.

Autor: M. I. (seventh_son)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So, wenn ich vor der Zeichenausgabe nichts anderes ausgebe, funktioniert 
es. Sowie ich aber vorher eine andere printf-Anweisung schreibe, oder 
das Zeichen selbst in eine Anweisung a la printf("Zeichen %c", c) 
schreibe, wird das Zeichen nicht ausgegeben und nach Abarbeitung dieser 
Anweisung steht das letzte ausgegebene Zeichen (im obigen Fall ein 
Leerzeichen) in der Variable.

Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also werden Speicherbereiche im Programm überschrieben. Du hast aber 
nicht genug Programmcode und Infos zum Target angegeben, um genaue 
Aussagen zu machen.

Derzeit vermute ich,

1/ dass diese Speicherbereiche (Stringkonstante, c) auf dem Stack liegen 
und der Stack zu klein ist oder

2/ dass c eine begrenzte Gültigkeit im Programm hat und du es nach 
Ablauf der Lebensdauer abprüfst

int main(void)
{
   printf("irgendwas");
   {
      char c;
      c = getchar();
      printf(c); // geht
   }
   printf(c);    // geht nicht. c ist tot.
}

Autor: M. I. (seventh_son)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
c ist bei der Ausgabe noch nicht tot.

Der Mikroprozessor bietet mir die Anweisung "print", die anscheinend als 
Ersatz für printf benutzt werden soll. Damit funktioniert es auch.

Autor: OliverSo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Der Mikroprozessor bietet mir die Anweisung "print",

Mit was, auf was, und für was programmierst du denn eigentlich?

Oliver

Autor: M. I. (seventh_son)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
MicroBlaze-Softcore

Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Der Mikroprozessor bietet mir die Anweisung "print", die anscheinend als
> Ersatz für printf benutzt werden soll. Damit funktioniert es auch.

Das ist ein starkes Indiz für die Stackgehtaus-Theorie. printf ist eine 
mächtige, aber eher stackhungrige Funktion.

Autor: seventh_son (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Stefan

Was könnte ich dagegen tun?

Stack vergrößern? Variable in anderen Speicherbereich schreiben?

Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Beides kann helfen.

Wie du den Stack bei deinem Target (bzw. dessen Toolchain) vergrösserst, 
kann ich dir nicht sagen. Müsste in der Doku stehen oder im Netz suchen.

Das Verlagern von lokalen Variablen in den DATA oder BSS Bereich als 
globale oder statische Variablen ist eine Alternative. Aber das 
Verlagern von nur einer Variable wird das Problem wahrscheinlich nur an 
eine andere ggf. schwerer zufindende Stelle verschieben. Schau dir 
deinen Sourcecode kritsch auf lokalen Speicherbedarf auf dem Stack an.

Autor: seventh_son (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mein Sourcecode ist ja noch relativ knapp gehalten, nur ein bißchen E/A 
marke printf und getchar.

Habe mal int-Variablen neben den char-Variablen deklariert, die werden 
mir vom Debugger gar nicht angezeigt. Bei float stürzt der Debugger 
sogar ab. Da scheint noch mehr im Argen zu liegen.

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.