Hallo,
wie kann man mit den 'Arduino Uno R3' unter Nutzung von Serial,
spezielle Tastaturkombination wie 'CTRL + X' oder 'ALT + F3' empfangen
und auswerten?
Mit dem nachfolgenden Code kommen nur 'normale' Tasten an:
Über die Serielle Verbindung werden Bytes ausgetauscht.
Wenn du diese Bytes als Text interpretieren willst, musst du einen
Zeichensatz festlegen, der bestimmt, welche(s) Byte(s) welchem
Buchstaben entsprechen.
Bei ASCII z.B. 0x41 = "A" usw.
Wenn du einen Zeichensatz hast, der Byte-Kodierungen für CTRL-X und
ALT-F3 enthält, und beide Seiten sich auf diesen einigen, bist du
fertig.
Jörg schrieb:> wie kann man mit den 'Arduino Uno R3' unter Nutzung von Serial,> spezielle Tastaturkombination wie 'CTRL + X' oder 'ALT + F3' empfangen> und auswerten?
Garnicht
Jörg schrieb:> wie kann man mit den 'Arduino Uno R3' unter Nutzung von Serial,> spezielle Tastaturkombination wie 'CTRL + X' oder 'ALT + F3' empfangen> und auswerten?
Hast du ein (Terminal)programm, das bei diesen Tastenkombinationen ein
Zeichen auf der seriellen Schnitte sendet?
Wenn ja: welches Zeichen (bzw. welche Zeichenkombination) sendet das
Programm beim Drücken dieser Tastenkombinationen auf der seriellen
Schnitte?
Jörg schrieb:> spezielle Tastaturkombination wie 'CTRL + X'
Bei VT100 & Co. 0x18.
Jörg schrieb:> oder 'ALT + F3'
Hängt von der verwendeten Terminalemulation ab, bei VT100 gar nicht.
Hmmm schrieb:> Jörg schrieb:>> spezielle Tastaturkombination wie 'CTRL + X'>> Bei VT100 & Co. 0x18.
Das ist Bestandteil des ASCII-Standards.
https://upload.wikimedia.org/wikipedia/commons/c/cf/USASCII_code_chart.png
CTRL-A 0x01 (SOH)
..
CTRL-Z 0x1A (SUB)
Dazwischen finden sich auch CTRL-M (0x0D, CR) oder CTRL-J (0x0A, LF) und
andere Steuerzeichen (TAB, BEL, BS etc.).
Den Code bekommt man, indem man vom ASCII-Code der Großbuchstaben 0x40
abzieht.
Hat man eine US-Tastatur, kann man zusätzlich noch
CTRL-@ 0x00 (Nul)
CTRL-[ 0x1B (Esc)
CTRL-\ 0x1C
CTRL-] 0x1D
CTRL-^ 0x1E
CTRL-_ 0x1F
eingeben und kommt so auf insgesamt 32 Möglichkeiten (0x00 bis 0x1F).
Für andere Tasten gibt es keine definierten Kombinationen mit CTRL,
weder mit Zahlen, anderen Sonderzeichen noch Kleinbuchstaben.
Tasten wie ALT und Kombinationen damit sind nicht definiert, deren
Interpretation hängt, wie schon von "hmm" beschrieben, vom verwendeten
Terminalprogramm ab.
Harald K. schrieb:> Das ist Bestandteil des ASCII-Standards.
ASCII definiert die als Steuerzeichen, aber CTRL+x darauf zu mappen,
dürfte eine Idee von DEC gewesen sein.
Das ist ja alles schön und gut, klärt aber nicht die Frage des TO nach
der Empfangsmöglichkeit. Dazu muss man wissen, welche(s) Zeichen beim
Drücken dieser Tastenkombinationen über die serielle Schnittstelle
geschickt werden.
Einfachster Ansatz: Tastatur mit serieller Schnittstelle an den Arduono
anschließen und gucken, welche Bytes das UART empfängt. Dann ist auch
klar auf welche Bytes die Auswertung ansprechen muss. Hauptkunststück
wird sein, eine Tastatur mit einer seriellen Schnittstelle (im Sinne des
Arduono Uno R3) zu finden.
Rainer W. schrieb:> Dazu muss man wissen, welche(s) Zeichen beim> Drücken dieser Tastenkombinationen über die serielle Schnittstelle> geschickt werden.
Genau das habe ich im Zusammenhang mit der Ctrl-Taste ausführlich
beschrieben.
Rainer W. schrieb:> Einfachster Ansatz: Tastatur mit serieller Schnittstelle an den Arduono> anschließen
Und wo bekommst Du eine Tastatur mit serieller Schnittstelle her?
PC-Tastaturen (die, die keine USB-Tastaturen sind) verwenden eine
synchrone serielle Schnittstelle und übertragen über diese sog.
Scan-Codes, die nichts mit dem eigentlichen Zeichencode zu tun haben,
und zwar sowohl, wenn eine Taste gedrückt als auch wenn sie wieder
losgelassen wird.
Ich entnehme aber den Ausführungen des Threadstarters, daß er seinen
Arduino über eine serielle Schnittstelle mit einem PC verbinden will,
auf dem ein (nicht näher genanntes) Terminalprogramm läuft, und nicht,
daß er eine PC-Tastatur an seinem Arduino betreiben will.
Daher ist der Ansatz nicht zielführend.
Rainer W. schrieb:> Das ist ja alles schön und gut, klärt aber nicht die Frage des TO nach> der Empfangsmöglichkeit. Dazu muss man wissen, welche(s) Zeichen beim> Drücken dieser Tastenkombinationen über die serielle Schnittstelle> geschickt werden.
Richtig. Und genau diese Zuordnung zwischen gedrückter Taste (bzw.
Taskenkombination) und gesendetem Code definiert die Terminal-Emulation
des Terminalprogramms. Die meisten Terminalprogramme können mehrere
davon. Ein Klassiker ist dabei VT100.
Diese Emulation und viele weitere mappen die Tastenkombination CTRL +
<Buchstabe> auf die ASCII-Steuerzeichen 0x01 .. 0x1A (für CTRL + C
bespielsweise auf 0x03 = ETX). Die könnte man als kleinsten gemeinsamen
Nenner zumindest in Erwägung ziehen.
Moin,
danke für den Input; Da habe ich was zu lesen;).
Ich hatte allerdings es versäumt zu erwähnen das ich für erste Test
ausschließlich die Arduino-IDE 2.3.2 (Eingabe-Zeile im Seriellen
Monitor) verwende. Ob diese nun die 'richtige' Codierung übernimmt,
entzieht sich meiner Kenntnis. Mir ist nur aufgefallen, dass vom
'CTRL+X' nur das 'X' ankam, daher die Fragestellung.
Axel S. schrieb:> Diese Emulation und viele weitere mappen die Tastenkombination ...
Ohne mich allzusehr aus dem Fenster zu lehnen, das dürfte jede
Terminalemulation machen. Wie schon ausführlich dargelegt, ist das eine
bald 60 Jahre alte Konvention.
Jörg schrieb:> Mir ist nur aufgefallen, dass vom> 'CTRL+X' nur das 'X' ankam, daher die Fragestellung.
Und Du hast die Tasten auch gleichzeitig, und nicht nacheinander
gedrückt? (genauer: Ctrl runterdrücken, unten lassen, X drücken, X
loslassen Ctrl loslassen)
Dann nimm ein richtiges Terminalprogramm, wie z.B. Teraterm, und lass'
das "Terminal"-Fenster der Arduino-IDE links liegen.
Das von manchen hier hartnäckig als Terminalprogramm bezeichnete hterm
ist hingegen kein Terminalprogramm, da es keinerlei Terminal emuliert.
Jörg schrieb:> wie kann man mit den 'Arduino Uno R3' unter Nutzung von Serial,> spezielle Tastaturkombination wie 'CTRL + X' oder 'ALT + F3' empfangen> und auswerten?
Gar nicht, weil die ALT+F3 gar nicht gesendet werden, und CTRL-X nicht
von jedem Terminal durchgereicht werden.
Jörg schrieb:> Ich möchte nicht 'Serial' neu programmieren
Tja, keine Arme, keine Kekse. Man müsste die 'IBM' Tastatur direkt an
den uC anschliessen und dann eben nicht RS232 seriell sondern nach PS/2
oder USB auswerten. Vielleicht noch über Bluetooth wenn man so ein
Funkmodul spendiert (nicht den USB Dongle der Tastatur, denn dafür
müsste man ein USB Host nachprogrammieren, zu viel für Arduinos.
Oder auf dem PC an dem die PC Tastatur hängt ein Programm starten, dass
ALLE Tastatureingaben captured und die Scancodes an den uC seriell
sendet. Dann ist der PC so lange (bis man das Programm mit der Maus
beendet) halt nicht mehr brauchbar.
Jörg schrieb:> wie kann man mit den 'Arduino Uno R3' unter Nutzung von Serial,> spezielle Tastaturkombination wie 'CTRL + X' oder 'ALT + F3' empfangen> und auswerten?
Warum willst Du sowas verrücktes tun?
Diese Kombinationen dienen dazu, um von OS (Windows) ausgewertet zu
werden und eben nicht über die UART gesendet zu werden.
Peter D. schrieb:> Diese Kombinationen dienen dazu, um von OS (Windows) ausgewertet zu> werden und eben nicht über die UART gesendet zu werden.
Das Serielle Terminal war ursprünglich dafür gedacht, dass der Computer
und damit das OS auf der anderen Seite des Kabels liegt. Insofern machte
es Sinn, diese Tastenkombinationen mit zu übertragen, damit eben das OS
diese auswerten kann...
Braucht natürlich einen echten Terminal Emulator, und nicht nur eine
UART<->Konsole Debughilfe in der IDE. Und ist wie schon mehrfach
beschrieben auf die Tasten beschränkt, die vor ~60 Jahren so üblich
waren, wenn man kompatibel bleiben will.
Wenn nicht, hätte man z.B. die Option auf "xterm" statt VT100 zu gehen,
und kann dann z.B. auch die Maus benutzen.
(Arduino sendet "ESC [ ? 1000 h", das Terminal sendet dann
Maus-Klicks/Releases mit Koordinaten per ESC-Sequenz ESC [ M <Button>
<X> <Y> an den Arduino, in "button" sind auch die Modifier-Keys
enhalten, d.H. du kannst "Shift-Klick" usw. erkennen)
Danke nochmal:)
Ich gebe ja zu das mit dem 'Alt+F3' ist unglücklich kommuniziert.
Vergesst es also bitte.
Ich schau mal wie sich die Kommunikation mit einem anderen Programm
darstellt.
Harald K. schrieb:> Das von manchen hier hartnäckig als Terminalprogramm bezeichnete hterm> ist hingegen kein Terminalprogramm, da es keinerlei Terminal emuliert.
Seit wann ist es notwendige Voraussetzung für ein Terminalprogramm,
irgendein (historisches Hardware-) Terminal emulieren zu können?
Natürlich ist hterm ein Terminalprogramm. Man kann damit IO mit einem
entfernten Peer betreiben. Mehr muss ein Terminalprogramm nicht können,
um ein Terminalprogramm zu sein. Und mehr konnten auch frühe
TTY-Terminals nicht.
Alles andere kommt nur durch Konvention dazu. Woraus insbesondere auch
die Tatsache resultiert, dass es so viele verschiedene Terminals gab und
damit heute so viele Terminalemulationen mit jeweils noch erheblicher
Konfugierbarkeit im Detail.
hterm wurde halt mit anderer Zielstellung entwickelt als spätere
Hardwareterminals. Dementsprechend bietet es andere Funktionalitäten,
statt sklavisch die Konventionen vergangener Epochen nachzustricken.
Dass das, was hterm bietet, auch gebraucht wird, zeigt die Beliebtheit
von hterm.
Ob S. schrieb:> Seit wann ist es notwendige Voraussetzung für ein Terminalprogramm,> irgendein (historisches Hardware-) Terminal emulieren zu können?
Weil es sonst kein Terminal ist.
Die Funktion "ein Terminal emulieren" ist genau das, was ein
Terminalprogramm ausmacht. Emuliert ein Programm kein Terminal, ist es
kein Terminalprogramm.
Ganz einfach, eigentlich.
Harald K. schrieb:> Weil es sonst kein Terminal ist.
Nein, eben das siehst du falsch. Ein Terminal ist der Endpunkt einer
IO-Strecke. Nicht mehr und nicht weniger.
Ob S. schrieb:> Harald K. schrieb:>>> Weil es sonst kein Terminal ist.>> Nein, eben das siehst du falsch. Ein Terminal ist der Endpunkt einer> IO-Strecke. Nicht mehr und nicht weniger.
Mehr noch: Es muß nicht mal IO sein. Es kann auch z.B. nur Ausgabe sein.
Siehe "Kassenterminal" o.Ä.
Ob S. schrieb:> Mehr noch: Es muß nicht mal IO sein. Es kann auch z.B. nur Ausgabe sein.> Siehe "Kassenterminal" o.Ä.
Wie passt dann das Flughafenterminal, ein Container-Terminal, Ölterminal
usw. in die Reihe?
https://de.wikipedia.org/wiki/Terminal_(Computer)
Ob S. schrieb:> da steht im Prinzip genau das> drin, was ich meinte...
Wenn der TE eine Software braucht, die auf seinem Rechner läuft, und
Tastendrücke wie Ctrl-X über die Serielle Schnittstelle an einen Arduino
sendet, aber seine jetzige das nicht kann, dann braucht er eine andere.
Jede Software die üblicherweise als "Terminal-Emulation" benannt wird,
macht das. Einfach weil sie ein historisches Terminal emuliert, wo das
Standardfunktionalität war.
Du kannst dem TE natürlich auch ein Kassenterminal oder ein
Flughafenterminal als Alternative vorschlagen, nur wird ihm das nicht
weiterhelfen. Auch ein Flughafenterminal-Emulator nicht.
Und eine Terminal-Emulations-Software, die irgendein Terminal (egal ob
real, historisch, oder rein der Phantasie entsprungen) emuliert was
keine Ctrl-Taste hat(te), hilft ihm auch nicht, weil der Emulation dann
wohl das gewünschte Feature fehlt.
Εrnst B. schrieb:> Wenn der TE eine Software braucht, die auf seinem Rechner läuft, und> Tastendrücke wie Ctrl-X über die Serielle Schnittstelle an einen Arduino> sendet, aber seine jetzige das nicht kann, dann braucht er eine andere.
Ja, das ist unstrittig.
> Jede Software die üblicherweise als "Terminal-Emulation" benannt wird,> macht das.
Nein!
> Einfach weil sie ein historisches Terminal emuliert, wo das> Standardfunktionalität war.
Das kommt dann halt drauf an, welches genau man gewählt hat. Und oft
auch noch: in welcher genauen Ausprägung.
Hast du es jetzt begriffen?
Ob S. schrieb:> Hast du es jetzt begriffen?
Du scheinbar noch nicht.
Um beim Beispiel weiter oben zu bleiben:
hterm überträgt kein Ctrl-X. hterm bezeichnet sich selber als
"Terminal", NICHT als Terminal-Emulation.
Man könnte ein Programm schreiben, was das Verhalten von hterm emuliert,
und das dann als "Terminal-Emulation" vertreiben. Wäre halt stark
irreführend, weil es sich anders als 99,99% aller anderen
Terminal-Emulationen verhält.
Wenn du einen "Windows-Emulator" runterlädst, erwartest du doch auch,
dass der Microsoft Windows emuliert, und keine Spezial-Software zum
Nachahmen des Fensterheber-Kurbelgeräusches eines 1966er Ford Mustang.
Ob S. schrieb:> Das kommt dann halt drauf an, welches genau man gewählt hat.
Dann nenn' mir doch mal ein Terminal, das das nicht macht.
Ctrl-Buchstabe in korrespondierende Control-Codes übersetzen. Und ich
meine ein Terminal, nicht Deine Bibellesungsinterpretation.
Also: Welche Hardwarekiste mit Tastatur und Bildschirm (oder Druckwerk),
die als Terminal für den Betrieb an einem Computer gebaut wurde, macht
es nicht?
Εrnst B. schrieb:> hterm überträgt kein Ctrl-X.
Quatsch. Man wechsele für die Eingabe temporär auf Hex, tippe
nacheinander auf die Tasten "1" und "8" und alles wird gut. Jeder
dümmliche Terminal-Server auf der Gegenseite, der halt darauf geeicht
ist, ein Byte mit dem Wert 0x18 für den Tastendruck Ctrl-X zu empfangen,
wird das akzeptieren.
Tsss. Ich unterhalte mich offensichtlich mit Leuten, die das Problem
(und die recht generelle Lösung, die hterm dafür bietet) überhaupt nicht
verstehen...
Ob S. schrieb:> Man wechsele für die Eingabe temporär auf Hex, tippe> nacheinander auf die Tasten "1" und "8" und alles wird gut.
Man hat den Leuten in den Anfängen der Computerzeit ja viel zugemutet,
aber das wäre selbst damals zuviel gewesen...
Das Handbuch sagt: Drücke Ctrl-X, das Programm zeigt an, drücke Ctrl-X,
die Tastatur hat sowohl eine Ctrl- als auch eine X-Taste, aber nein, du
musst den Eingabemodus umschalten, die schicke Tabelle konsultieren, die
neben dem Monitor klebt, und einen Hex-Code eintippen... Famos.
Ob S. schrieb:> überhaupt nicht verstehen...
Du verstehst es nicht...
Ja, es gibt gute Gründe, warum hterm mit den seit über einem halben
Jahrhundert üblichen Konventionen von seriellen Computer-Terminals und
Terminal-Emulatoren bricht.
Genau das macht es für viele Anwendungsfälle zu einem sehr wertvollen
Werkzeug.
Aber: Exakt das macht es auch für den "Terminal-Emulator"-Anwendungsfall
unbequem bis unbrauchbar.
Also: Einfach das richtige Werkzeug für die anstehende Aufgabe nehmen.
Schrauben und Hammer und so...
Ich benutze noch das gute alte HyperTerminal aus Windows-XP. Besondere
Steuerzeichen außer die üblichen \n, \r, \b brauche ich nicht, alles
geht über einen Stringparser.
Peter D. schrieb:> Ich benutze noch das gute alte HyperTerminal aus Windows-XP.
Auch das kann Ctrl-X etc. übertragen. Ist ja auch ein Terminalprogramm.
Besser ist Teraterm. Das gibts auch im Sourcecode.
Εrnst B. schrieb:> Aber: Exakt das macht es auch für den "Terminal-Emulator"-Anwendungsfall> unbequem bis unbrauchbar.
Das ja.
Es ist und bleibt aber eben eine Terminal-Programm. Eins, was halt
(außer für primitivste TTY-Terminals) keine Emulation enthält.
Und genau das ist der essenzielle Vorteil von hterm. Es wird kein
höheres Protokoll zwangsweise indoktriniert. Anything goes.
Ob S. schrieb:> Und genau das ist der essenzielle Vorteil von hterm. Es wird kein> höheres Protokoll zwangsweise indoktriniert. Anything goes.
Ergänzend:
Und sei es nur, um (zumindest näherungsweise) herauszufinden, was für
ein verficktes Terminal ein unbekannter Peer eigentlich erwartet...