Forum: PC-Programmierung STRG+Z als ASCII Zeichen über printf Befehl senden


von Peter G. (grudolf)


Lesenswert?

Hallo
Ich möchte gerne über die serielle Schnittstelle ein "STRG+Z" über die 
Leitung senden. Jedoch geschieht dies mit einem "printf" Befehl, und im 
C Quellcode. Jedoch weiß ich nicht, wie man STRG+Z als ASCII Zeichen 
eingeben kann, und ich auch nichts ähnliches gefunden habe.
Falls jemand nicht genau weiß, was ich meine: Enter in ASCII wäre "\r". 
Ich brauche eben das STRG+Z.

Wäre behilflich, wenn mir jemand helfen könnte.


printf("0891XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXC006 
???????");

Die Fragezeichen hätt ich gerne beantwortet ;).

PS: Der ganze Befehl ist zensiert, da es sich um einen at+cmgs Befehl im 
PDU Format handelt...

Danke,
LG

von Peter (Gast)


Lesenswert?

Hallo,

mit printf("%c", 26 ) sollte es gehen.

von Peter G. (grudolf)


Lesenswert?

Peter wrote:
> Hallo,
>
> mit printf("%c", 26 ) sollte es gehen.

Also meinst du

printf("0891XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXC006 
%c",26);
?

LG

von Peter (Gast)


Lesenswert?

genau.

von Klaus W. (mfgkw)


Lesenswert?

Es ginge auch:
1
printf("0891XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXC006\x1a");

Solange printf nimmt, ist es egal.
Aber nach diesem Strickmuster könnte man auch eine einfachere Funktion 
als printf() nehmen (fwrite(), puts() etc.).

von Sven P. (Gast)


Lesenswert?

Vorallem sollte man mal überlegen, was Strg+Z überhaupt ergibt. Das 
hängt nämlich zum Teil ganz extrem davon ab, was das Terminal daraus 
macht. Termcap wäre schon mal ein guter Anfang...

von Eddy C. (chrisi)


Lesenswert?

"This is CTRL-Z:\032"

ASCII-Code oktal mit drei Stellen.

von Peter G. (grudolf)


Lesenswert?

Peter wrote:
> Hallo,
>
> mit printf("%c", 26 ) sollte es gehen.

Hallo, bin jetzt wieder mal im Land.
Also theoretisch ist es richtig mit printf"%c",26), jedenfalls wird so 
STRG+Z gesendet (1A in Hex).
Jedoch stoße ich auf ein weiteres Problem:
Wenn ich über das HyperTerminal das Siemens Handy verbinde (Ansteuerung 
über die AT Befehle...), dann sende ich folgendes:
at                      //Bestätigung mit Enter
at+cmgs=22              //Bestätigung mit Enter
"PDU-Nachricht"         //Bestätigung mit STRG+Z

In meinem C Programm schaut es wie folgt aus:
printf("at\r");
printf("at+cmgs=22\r");
printf("069XXXXXXXXXXXXXXXXXXXXXX500730074%c",26);

Jedoch geht das Versenden von den SMS nicht, anrufen konnte ich jedoch 
schon.
Das Problem liegt glaube ich daran, dass nach dem 
"printf("at+cmgs=22\r");"   vom Handy ein  ">"  zurückgesendet wird.
Hier liegt mein Verdacht.
Vielleicht kennt sich jemand hier gut aus, und kann mir helfen wie es 
doch geht, wäre echt dankbar.
Mfg

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Du wirst zwischen den einzelnen Ausgaben an das Telephon dessen 
Antworten abwarten und auswerten müssen. Tust Du das nicht, "überfährst" 
Du das Telephon.

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

Außerdem haben viele Telfone auch gerne einen "echten" Zeilenumbruch 
alla "\r\n" ...

von Peter G. (grudolf)


Lesenswert?

Rufus t. Firefly schrieb:
> Du wirst zwischen den einzelnen Ausgaben an das Telephon dessen
> Antworten abwarten und auswerten müssen. Tust Du das nicht, "überfährst"
> Du das Telephon.

Hallo.
Bin jetzt wieder mal hier.
Du hattest recht.
Mit...
printf("at\r");
delay_ms(1000);
printf("at+cmgs=22\r");
delay_ms(1000);
printf("069XXXXXXXXXXXXXXXXXXXXXX500730074%c",26);
...funktionierte es.

Und jetzt mal ein neues Thema.
Hätte jetzt noch eine liebe Zusatzfunktion im Gedanken:
Würde gerne von einem anderen Handy aus auf das Siemens Handy eine SMS 
senden, in welcher man einen Text hineinschreibt kann, und dieser Text 
soll von meinem Mikrocontroller ausgelesen werden.
Hat jemand da Tipps für mich?
Danke!

LG

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Sauberer als Warten wäre ein Auswerten der Antworten des Telephones.

von Peter G. (grudolf)


Lesenswert?

Rufus t. Firefly schrieb:
> Sauberer als Warten wäre ein Auswerten der Antworten des Telephones.

Die Auswertung der Antwort ist bei mir technisch nicht möglich zzt., da 
ich keine Schnittstelle dafür bereit habe.
Außerdem geht es so, und das ist das Wichtige.
LG

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

> Die Auswertung der Antwort ist bei mir technisch nicht möglich
> zzt., da ich keine Schnittstelle dafür bereit habe.

Du nutzt nur die TxD-Leitung Deines µCs und RxD ist anderweitig 
belegt?

Dann aber kann das hier nicht funktionieren:

> Würde gerne von einem anderen Handy aus auf das Siemens Handy
> eine SMS senden, in welcher man einen Text hineinschreibt kann,
> und dieser Text soll von meinem Mikrocontroller ausgelesen werden.

von Peter G. (grudolf)


Lesenswert?

Die Transmit und Receive Leitung ist belegt.
Jedoch ist z.B. eine Auswertung in dem Sinne nicht möglich, dass ich die 
empfangenen Daten vom Handy irgendwo anzeigen kann.
Kann die Daten vom Handy nur in einem Speicher auf den PC direkt 
schreiben.
LG

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Auswertung heißt ja nicht zwangsweise Anzeigen, sondern hier, daß nach 
dem Senden eines AT-Kommandos auf die Antwort gewartet wird (die "OK" 
lauten sollte) und erst nach dem Eintreffen der Antwort mit dem nächsten 
Kommando fortgefahren wird.

von Peter G. (grudolf)


Lesenswert?

Nein, dann wird es nicht ausgewertet.
Wie kann ich so eine Auswertung noch realisieren?
Hab mit der Handy-Anbinung zum Mikrocontroller nicht so viel Erfahrung.
LG

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

> Nein, dann wird es nicht ausgewertet.

Ja, dann mach das doch einfach. Ich verstehe Dein Problem nicht so 
recht.

von Peter G. (grudolf)


Lesenswert?

Das Problem:
Hab mehr oder weniger das PIC Demoboard.
Das Handy ist an den Mikrocontroller angeschlossen und kann auch Daten 
zurücksenden, da Transmit und Receive Leitungen in Verwendung sind.
Jedoch kann ich nicht auswerten was das Handy zurücksendet, da ich es 
nirgends anzeigen lassen kann (vgl. HyperTerminal).
Verstehst du schon ein bisschen mehr was ich meine?
LG

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Hier liegt ein Missverständnis vor. Du musst die Daten, die das Telephon 
zurücksendet, nicht anzeigen, Du musst sie nur auswerten, um den 
Zeitpunkt bestimmen zu können, wann Du das nächste Kommando an das 
Telephon senden kannst:


  printf("at\r");

... hier auf Antwort warten

  printf("at+cmgs=22\r");

... hier auf Antwort warten

  printf("069XXXXXXXXXXXXXXXXXXXXXX500730074%c",26);

naja, und hier natürlich auch wieder auf Antwort warten.

Wird es allmählich klarer?

von Karl H. (kbuchegg)


Lesenswert?

Uwe L. schrieb:

> nirgends anzeigen lassen kann (vgl. HyperTerminal).
> Verstehst du schon ein bisschen mehr was ich meine?

Du musst die Antwort einfach nur von der seriellen Schnittstelle 
abholen. Wenn du gut drauf bist, vergleichst du noch ob das Handy ein 
"OK" zurückgeschickt hat oder nicht. Und wenn nicht, schaltest du von 
mir aus eine LED ein, damit dein Benutzer auch weiß, das da was schief 
gelaufen ist.

Das hat aber nichts damit zu tun, ob du die Antwort wo anzeigen kannst 
oder nicht. Du kannst dir ja auch von der Post einen postlagernden Brief 
abholen und den ungeöffnet wegwerfen. Du musst auch nicht alle Briefe in 
deinem Briefkasten tatsächlich lesen. Du musst sie nur aus dem 
Briefkasten rausnehmen, denn wenn du es nicht tust, wird dir der Postler 
irgendwann keine neuen mehr reinstecken. Ob du die Briefe liest oder 
nicht, ist dem Postler hingegen egal.

von Peter G. (grudolf)


Lesenswert?

Hallo.
Ich sehe, es war mein Fehler, ich habe mich ein wenig falsch 
ausgedrückt.
Das Programm welches SMS senden soll, funktioniert so, und ich möchte es 
auch nicht ausbauen
und nicht auswerten was das Handy zurücksendet.
Jedoch habe ich folgendes gemeint:
Ich möchte jetzt ein Programm schreiben, bei dem mit einem AT Befehl
, der vom Mikrocontroller aus gesendet wird, der Nachrichtenspeicher im 
Handy ausgelesen wird,
und diese Zeichenfolge welche ich dann vom Handy zurückbekomme (PDU 
Message), möchte ich
einzeln als Character einlesen und auswerten.
Das Problem ist, dass man Character die z.B. von einer Tastatur kommen 
ja mit einem Enter bestätigt.
Jedoch kann ich die Zeichenfolge die mir das Handy an den µController 
sendet nicht im Programm (z.B. mittels Schleife)
abfangen und einlesen, da das Handy ja nur einzelne Zeichen, aber keine 
Steuerzeichen wie Enter mit schickt.
Habt ihr ungefähr verstanden worum es geht?
Ich hoffe ich konnte mich genauer formulieren.
LG

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

> Das Problem ist, dass man Character die z.B. von einer Tastatur kommen
> ja mit einem Enter bestätigt.

Tut man das?

> Jedoch kann ich die Zeichenfolge die mir das Handy an den µController
> sendet nicht im Programm (z.B. mittels Schleife)
> abfangen und einlesen, da das Handy ja nur einzelne Zeichen, aber keine
> Steuerzeichen wie Enter mit schickt.

Das Telephon wird als Antwort auf das entsprechende AT-Kommando eine 
Zeichenkette senden, also mehrere Zeichen hintereinander. Und aller 
Wahrscheinlichkeit nach wird es am Ende der Zeichenkette sogar CR 
und/oder LF senden.

Mir scheint, daß da noch das eine oder andere Verständnisproblem 
vorliegt.

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.