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
> > 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.
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
@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.
Möchte nochmal darauf hinweisen dass mein Problem trotz Behebung des "&-Fehlers" nicht gelöst ist ;)
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?
>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
@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.
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.
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. }
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.
>Der Mikroprozessor bietet mir die Anweisung "print",
Mit was, auf was, und für was programmierst du denn eigentlich?
Oliver
> 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.
@Stefan Was könnte ich dagegen tun? Stack vergrößern? Variable in anderen Speicherbereich schreiben?
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.