Forum: Compiler & IDEs Eingabe eines Zeichens per RS232


von M. I. (seventh_son)


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

von Rufus Τ. F. (rufus) Benutzerseite


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.

von Εrnst B. (ernst)


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

von M. I. (seventh_son)


Lesenswert?

Natürlich. Flüchtigkeitsfehler. thx

von M. I. (seventh_son)


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.

von M. I. (seventh_son)


Lesenswert?

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

von M. I. (seventh_son)


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?

von OliverSo (Gast)


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

von M. I. (seventh_son)


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.

von M. I. (seventh_son)


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.

von Stefan (Gast)


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.
}

von M. I. (seventh_son)


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.

von OliverSo (Gast)


Lesenswert?

>Der Mikroprozessor bietet mir die Anweisung "print",

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

Oliver

von M. I. (seventh_son)


Lesenswert?

MicroBlaze-Softcore

von Stefan (Gast)


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.

von seventh_son (Gast)


Lesenswert?

@Stefan

Was könnte ich dagegen tun?

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

von Stefan (Gast)


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.

von seventh_son (Gast)


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.

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.