Arduino, Serial und 'spezial Tasten', wie?

OP #7621924
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.

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

Moderator (Firma: Titel) Persönliche Seite #7621946
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?

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

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

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

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

OP #7622415
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.

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

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

#7622531
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)

(Firma: 1984now) #7622787
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.

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

(Firma: 1984now) #7622894
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?

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

#7622907
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?

(Firma: 1984now) #7622922
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...

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

(Firma: 1984now) #7624368
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren