Forum: Mikrocontroller und Digitale Elektronik Arduino, Serial und 'spezial Tasten', wie?


von Jörg (lixtop)


Lesenswert?

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:
1
#include <Arduino.h>
2
3
#define LINE_BUFFER_SIZE 80
4
5
static char line[LINE_BUFFER_SIZE];
6
7
8
void setup() 
9
{
10
  Serial.begin(9600);
11
  Serial.println("Ihre Eingabe bitte:");
12
}
13
14
void loop() 
15
{
16
  uint8_t char_counter = 1;
17
  uint8_t c;
18
19
  for (;;) 
20
  {  
21
    while (Serial.available() > 0)
22
    {
23
      Serial.print("Daten verfügbar : ");
24
      c = Serial.read();
25
   
26
      Serial.println("[ 0x" + String(c, HEX) + String(" ], d") + String(c) + String(", ") + String((char)c));
27
28
    }
29
  }
30
}

Kleine Bemerkung: Ich möchte nicht 'Serial' neu programmieren (ISR 
usw.).

Danke für Tipps und Hinweise.

von Εrnst B. (ernst)


Lesenswert?

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

von John P. (brushlesspower)


Lesenswert?

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

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

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?

: Bearbeitet durch Moderator
von Hmmm (hmmm)


Lesenswert?

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.

von Klaus F. (klaus27f)


Lesenswert?

Hmmm schrieb:
>> oder 'ALT + F3'
> bei VT100 gar nicht

Was daran liegt, daß 1978 diese Funktionstasten noch "nicht erfunden" 
waren.

https://de.wikipedia.org/wiki/VT100
http://www.columbia.edu/cu/computinghistory/vt100.html

von Harald K. (kirnbichler)


Lesenswert?

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.

von Hmmm (hmmm)


Lesenswert?

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.

von Harald K. (kirnbichler)


Lesenswert?

Hmmm schrieb:
> dürfte eine Idee von DEC gewesen sein.

Aber lange vor VT100, das machte schon die Teletype so. Mit VT100 kamen 
die Escape-Sequenzen à la "ESC [2;10H" auf.

Siehe auch https://en.wikipedia.org/wiki/Caret_notation#History

von Hmmm (hmmm)


Lesenswert?

Harald K. schrieb:
> Mit VT100 kamen die Escape-Sequenzen à la "ESC [2;10H" auf.

Escape-Sequenzen hatte auch schon das VT52, wenn auch noch recht 
rudimentär.

Harald K. schrieb:
> Siehe auch https://en.wikipedia.org/wiki/Caret_notation#History

Interessanter Artikel.

von Harald K. (kirnbichler)


Lesenswert?

Wenn Du mehr über Terminals erfahren willst:

https://terminals-wiki.org/wiki/index.php/Main_Page

von Rainer W. (rawi)


Lesenswert?

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.

: Bearbeitet durch User
von Harald K. (kirnbichler)


Lesenswert?

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.

von Axel S. (a-za-z0-9)


Lesenswert?

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.

von Jörg (lixtop)


Lesenswert?

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.

von Harald K. (kirnbichler)


Lesenswert?

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.

von Michael B. (laberkopp)


Lesenswert?

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.

: Bearbeitet durch User
von Peter D. (peda)


Lesenswert?

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.

von Εrnst B. (ernst)


Lesenswert?

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)

von Jörg (lixtop)


Lesenswert?

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.

von Ob S. (Firma: 1984now) (observer)


Lesenswert?

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.

von Harald K. (kirnbichler)


Lesenswert?

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.

von Ob S. (Firma: 1984now) (observer)


Lesenswert?

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.

von Ob S. (Firma: 1984now) (observer)


Lesenswert?

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

von Εrnst B. (ernst)


Lesenswert?

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)

: Bearbeitet durch User
von Ob S. (Firma: 1984now) (observer)


Lesenswert?

Εrnst B. schrieb:

> https://de.wikipedia.org/wiki/Terminal_(Computer)

Hast du diesen Artikel auch wirklich gelesen und verstanden?

Tipp (für die nicht ganz so Schlauen): da steht im Prinzip genau das 
drin, was ich meinte...

von Εrnst B. (ernst)


Lesenswert?

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.

von Ob S. (Firma: 1984now) (observer)


Lesenswert?

Ε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?

von Εrnst B. (ernst)


Lesenswert?

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.

von Harald K. (kirnbichler)


Lesenswert?

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?

von Ob S. (Firma: 1984now) (observer)


Lesenswert?

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

von Εrnst B. (ernst)


Lesenswert?

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

von Jörg (lixtop)


Angehängte Dateien:

Lesenswert?

Moin Leute,

Ihr schießt mal wieder über das Ziel hinaus. Beendet den Disput.

von Peter D. (peda)


Lesenswert?

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.

von Harald K. (kirnbichler)


Lesenswert?

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.

von Ob S. (Firma: 1984now) (observer)


Lesenswert?

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

von Ob S. (Firma: 1984now) (observer)


Lesenswert?

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

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.