Forum: Mikrocontroller und Digitale Elektronik Terminal - Wie heißt das, was ich suche?


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von HappyNuYear (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Hi Leute,

also ich möchte mein Mikrocontroller mit einem Command Line Interface 
erweitern. Da gibt es die Variante 1) ich sende per UART den Befehl und 
erhalte danach dann die Antwort (z.B. über HTerm, cutecom).
Und dann gibt es die Variante 2) da kann man wie in der Linux Shell 
direkt sehen was man eingibt und auch mit Backspace den Befehl vor 
Absenden noch editieren etc.. Das kenne ich in Zusammenhang mit putty 
und einigen Ethernet Switchen.
Ich hoffe ihr wisst was ich meine. Gibt es für Variante 2) einen Namen?
So ganz klar ist mir das nämlich noch nicht wie das funktioniert. 
Wahrscheinlich wird mit jedem tippen der ganze Output neu geschrieben?

von b0fh (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Hallo,

Beim esp32 esp-idf gibt es eine Console Komponente die sehr 
aufschlussreich ist. Im Grunde besteht diese aus linenoise(-ng) und 
argtable3.

MfG

von Dergute W. (derguteweka)


Bewertung
0 lesenswert
nicht lesenswert
Moin,

HappyNuYear schrieb:
> Gibt es für Variante 2) einen Namen?

Ich wuerd' sagen: Shell oder CLI (command line interface)

Gruss
WK

von Georg (Gast)


Bewertung
0 lesenswert
nicht lesenswert
HappyNuYear schrieb:
> Gibt es für Variante 2) einen Namen?

Keinen genormten, aber local echo trifft es ganz gut. Bei einem 
ernstzunehmenden Terminal-Programm kann man das einstellen. Wenn der 
Empfänger die Daten als Antwort zurücksendet (was fast immer der Fall 
ist, z.B. bei einem Modem) sollte man das abschalten, damit man nicht 
alles doppelt sieht (das liegt dann nicht an Silvester).

Georg

von foobar (Gast)


Bewertung
3 lesenswert
nicht lesenswert
Bei 2 läuft zusätzlicher ein Zeileneditor auf dem Controller.  Der 
sendet die empfangenen Zeichen zurück (echo) und interpretiert einige 
davon als Editierkommandos (z.B. Backspace = letztes Zeichen löschen).

Hier mal ein einfaches Beispiel:
1
static void getline(u8 *buf, u8 size)
2
{
3
    u8 c, n = strlen(buf);
4
5
restart:
6
    buf[n] = 0;
7
    putlit("> ");
8
    putstr(buf);
9
    for (;;)
10
    {
11
        c = getch();
12
        if (c == '\n')  // Return - Eingabe beenden
13
        {
14
            putch('\n');
15
            buf[n] = 0;
16
            return;
17
        }
18
        else if (c == '\b')  // Backspace - letztes Zeichen löschen
19
        {
20
            if (n)
21
            {
22
                putlit("\b \b");
23
                n--;
24
            }
25
        }
26
        else if (c == 3)  // CTRL-C - Eingabe löschen
27
        {
28
            putlit("^C\n");
29
            n = 0;
30
            goto restart;
31
        }
32
        else if (c == '\f')  // CTRL-L - Bildschirm löschen
33
        {
34
            //putlit("\ec\e[H\e[2J");
35
            putlit("\ec");
36
            goto restart;
37
        }
38
        else if (c >= ' ' && c <= '~' && n < size-1)  // druckbares Zeichen
39
        {
40
            putch(c);
41
            buf[n++] = c;
42
        }
43
        else  // ignoriertes Zeichen - beepen
44
            putch('\a');
45
    }
46
}

von HappyNuYear (Gast)


Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe mal ein Beispiel angehängt.
Es ist sogar möglich mit Cursortasten Menüpukte auszuwählen.
Es muss irgendeinen Standard/Protokoll geben, welches da im Hintergrund 
läuft und genau dazu suche ich die Bezeichnung.
Scheinbar wird der Output ständig refreshed also muss es irgendwelche 
Sonderkommandos geben die Putty empfängt und daraufhin refreshed.

von HappyNuYear (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Mit einem anderen Terminalprogramm (cutecom) sieht der Output so aus:
1
<0x1b>[m<0x1b>[m<0x1b>[m<0x1b>[4;26H<0x1b>[4;26HSystem Parameter<0x1b>[m<0x1b>[m<0x1b>[6;26H<0x1b>[6;26HSwitch Security<0x1b>[m<0x1b>[m<0x1b>[8;26H<0x1b>[8;26HPort Configuration / Statistics<0x1b>[m<0x1b>[m<0x1b>[10;26H<0x1b>[10;26HDisable Learning<0x1b>[m<0x1b>[m<0x1b>[12;26H<0x1b>[12;26HConfiguration<0x1b>[m<0x1b>[m<0x1b>[14;26H<0x1b>[14;26HUpdate<0x1b>[m<0x1b>[7m<0x1b>[7m<0x1b>[16;26H<0x1b>[16;26HPassword<0x1b>[m<0x1b>[m<0x1b>[m<0x1b>[18;26H<0x1b>[18;26HPing<0x1b>[m<0x1b>[m<0x1b>[20;26H<0x1b>[20;26HSystem Reset<0x1b>[m<0x1b>[m<0x1b>[22;4H<0x1b>[22;4HLOGOUT<0x1b>[m<0x1b>[m<0x1b>[16;26H

Also man sieht bestimmte Sonderbefehle, die nur PuTTY interpretieren 
kann.

von foobar (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Der "Standard" nennt sind ANSI-Escapesequenzen[1].  Ein Programm auf dem 
Controller malt die Menues, wertet die Cursurtasten aus, malt 
entsprechend neu, steuert den Cursor, usw, usf.

Ein Paket, das einem das erleichtert, nennt sich ncurses[2].  Auf 
kleineren Mikrocontrollern wirst du das aber kaum zum Rennen bekommen.


[1] https://de.wikipedia.org/wiki/ANSI-Escapesequenz
[2] https://de.wikipedia.org/wiki/Ncurses

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Bewertung
0 lesenswert
nicht lesenswert
HappyNuYear schrieb:
> Es muss irgendeinen Standard/Protokoll geben, welches da im Hintergrund
> läuft und genau dazu suche ich die Bezeichnung.

Meinst du Terminal Emulationen wie VT-100,VT200 oder VT-52? Dabei kann 
der Host das Terminal steuern inkl. Position, Farbe usw.

von Helmut -. (dc3yc)


Bewertung
0 lesenswert
nicht lesenswert
Suche doch mal nach "ANSI-Escape-Sequenzen". Da gab es früher für 
bestimmte Terminals diese Steuersequenzen, mit denen du auf dem 
Bildschirm verschiedene Sachen machen kannst.

von Stefan ⛄ F. (stefanus)


Bewertung
1 lesenswert
nicht lesenswert
HappyNuYear schrieb:
> Es ist sogar möglich mit Cursortasten Menüpukte auszuwählen.
> Es muss irgendeinen Standard/Protokoll geben, welches da im Hintergrund
> läuft und genau dazu suche ich die Bezeichnung.

Ansi Escape Sequenzen
https://en.wikipedia.org/wiki/ANSI_escape_code

Beitrag #6532954 wurde vom Autor gelöscht.
von HappyNuYear (Gast)


Bewertung
0 lesenswert
nicht lesenswert
foobar schrieb:
> ANSI-Escapesequenzen

Matthias S. schrieb:
> VT-100

Ja, danke, das ist es.

http://ascii-table.com/ansi-escape-sequences-vt-100.php

Happy New Year!

von Christian H. (netzwanze) Benutzerseite


Bewertung
0 lesenswert
nicht lesenswert
HappyNuYear schrieb:
> Scheinbar wird der Output ständig refreshed

Nein, das wird da nicht gemacht. Wie aber bereits genannt, werden hier 
Escape-Sequenzen verwendet. Der von Dir beobachtete Refresh, erfolgt 
durch Cursorpositionierung und Überschreiben.

von tt2t (Gast)


Bewertung
0 lesenswert
nicht lesenswert
HappyNuYear schrieb:
> Gibt es für Variante 2) einen Namen?

Telnet

von W.S. (Gast)


Bewertung
-2 lesenswert
nicht lesenswert
HappyNuYear schrieb:
> also ich möchte mein Mikrocontroller mit einem Command Line Interface
> erweitern. Da gibt es die Variante 1)...

Ach wo. Es geht viel viel viel einfacher: Dein Terminalprogramm im PC 
sendet die Zeichen, die du eintippst, zum µC. Dort ist ein kleines 
Kommandoprogramm, das diese Zeichen in einen Puffer (üblich sind 80 
Zeichen) einlaufen läßt und dabei einige wenige Sonderzeichen passend 
interpretiert. Zum Beispiel 8 (=BS), was das letzte Zeichen löscht.

Und dieses Kommandoprogramm sendet die empfangenen Zeichen auch wieder 
zurück an den PC. Dort kannst du sie dann in deinem Terminalprogramm 
sehen. Und wenn die Zeile komplett ist (CR als Zeilenende), dann wird 
sie ausgewertet - je nachdem, was du da an Kommandos eingebaut hast.

Viel mehr braucht es nicht, um eine Kommandozeile im µC zu 
implementieren.
1
  /* Kommandozeile hereinholen */
2
int kzi;
3
4
void Talk (word wo)
5
{ char c;
6
7
  if (RxAvail(wo))
8
  { c =  GetChar(wo);
9
    if (c==10) return;
10
    if (c==13)
11
    { CRLF_Out(wo);
12
      DoCommand (Kommandozeile, wo);
13
      InitCmd(wo);
14
    }
15
    else
16
    { if (kzi>=(sizeof(Kommandozeile)-1)) return;
17
      if (c==8)
18
      { Char_Out(8, wo);
19
        Char_Out(' ', wo);
20
        Char_Out(8, wo);
21
        if (kzi) --kzi;
22
        Kommandozeile[kzi]=0;
23
      }
24
      else
25
      { Char_Out(c, wo);
26
        Kommandozeile[kzi++] = c;
27
        Kommandozeile[kzi] = 0;
28
      }
29
    }
30
  }
31
}

Und zur Auswertung dann so etwas:
1
char   Kommandozeile[80];
2
char*  Cpt;
3
4
void DoCommand (char* Pzeile, word wo)
5
{ char  c;
6
7
  Cpt = Pzeile;
8
  if (match("OTTOKAR",&Cpt)) { DoOttokar(wo); return;}
9
  if (match("EMIL",&Cpt))    { DoEmil(wo);  return;}
10
  ...und so weiter
11
  
12
  if (!*Cpt) return;
13
  String_Out("wat? ", wo);
14
  String_Out(Cpt, wo);
15
  CRLF_Out(wo);
16
}

Ist doch easy, oder?

W.S.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.