Arduino UNO Kommandozeilen-Schnittstelle (CLI): Schnell & Speichereffizient
Komponenten
- Arduino UNO (oder kompatibles Board)
Projektbeschreibung
Eine leistungsfähige, textbasierte Kommandozeilenschnittstelle (CLI) für Arduino-Sketches. Sie ermöglicht die Steuerung und Diagnose von Mikrocontroller-Projekten über den seriellen Monitor – ganz ohne zusätzliche Hardware. Befehle bestehen aus einem Namen und optionalen Argumenten (Zahlen oder Text), getrennt durch Leerzeichen oder Kommas. Die Implementierung ist extrem speicherschonend (C-Strings statt String-Objekte) und unterstützt sogar Backspace bei der Eingabe.
Architektur & Funktionsweise
Haupt-Loop
Der loop() ruft zyklisch zwei Funktionen auf:
#include "CommandLine.h"
void setup() {
Serial.begin(115200);
}
void loop() {
if (getCommandLineFromSerialPort(CommandLine)) {
DoMyCommand(CommandLine);
}
// Weitere Aufgaben hier...
}
CommandLine.h – Kernfunktionen
Die Datei enthält:
- Puffer-Verwaltung:
getCommandLineFromSerialPort()liest asynchron vom Serial-Port, behandelt CR/LF/Backspace, wandelt in Kleinbuchstaben um. - Token-Parsing: Nutzt
strtok()aus<string.h>für zerlegung in Wörter (Tokens). Helfer:readNumber()(viaatoi()) undreadWord(). - Befehls-Dispatcher:
DoMyCommand()vergleicht das erste Token mit bekannten Befehlen (if-else-Kette) und ruft die zugehörige Handler-Funktion auf. - Beispiel-Befehle:
add a,bundsub a,b– Addition/Subtraktion zweier Zahlen.
Eigene Befehle hinzufügen
- In
CommandLine.h: Neuen Befehls-Token definieren (const char* meinBefehl = "meinbefehl";) - Handler-Funktion schreiben (z. B.
int meinBefehlHandler() { ... }) - In
DoMyCommand()einen weiterenelse if-Zweig einfügen.
Beispiel: LED-Steuerung per CLI
const char* ledOnToken = "ledon";
const char* ledOffToken = "ledoff";
int ledOnHandler() {
int pin = readNumber(); // z.B. "ledon 13"
pinMode(pin, OUTPUT);
digitalWrite(pin, HIGH);
print2("LED an Pin ", pin);
return 0;
}
int ledOffHandler() {
int pin = readNumber();
digitalWrite(pin, LOW);
print2("LED aus Pin ", pin);
return 0;
}
// In DoMyCommand():
if (strcmp(cmd, ledOnToken) == 0) ledOnHandler();
else if (strcmp(cmd, ledOffToken) == 0) ledOffHandler();
Tipps & Best Practices
- Puffergröße:
COMMAND_BUFFER_LENGTHanpassen (Standard 25 Zeichen). - Trennzeichen:
delimiters = ", \n"– Komma, Leerzeichen, Zeilenende. - Groß-/Kleinschreibung: Eingabe wird per
tolower()normalisiert (auskommentiert im Code). - Erweiterung: Bei vielen Befehlen Hash-Tabelle oder Switch-Case über ersten Buchstaben nutzen.
- Debug-Makro:
print2("Label", wert)erleichtert Ausgabe von Variablen.
Vorteile dieser CLI
- Keine String-Objekte → minimaler RAM-Verbrauch
- Einfache Integration: Nur
#include "CommandLine.h"in Haupt-Sketch - Erweiterbar ohne Libraries
- Interaktiv testbar über Serial Monitor
- Ideal für Kalibrierung, Diagnose, manuelle Steuerung
Download & Weiterführendes
Der vollständige Code von CommandLine.h ist im Artikel enthalten. Einfach als neuen Tab CommandLine.h in der Arduino IDE anlegen, hineinkopieren, im Haupt-Sketch includieren – fertig.
Herstellungsprozess
- C# Kommentare meistern: Arten, Best Practices und XML-Dokumentation
- C#-Interfaces meistern: Definition, Implementierung und praktische Anwendungsfälle
- Java-Schnittstellen meistern: Konzepte, Implementierung und Best Practices
- Zuverlässiger kabelloser Einfahrtssensor für lange Einfahrten – Einfache Raspberry Pi Integration
- Low-Cost Infrarot-Näherungssensor für Raspberry Pi nur mit Digitalpins
- ANDY – Der vielseitige humanoide Roboter
- Simple Pi Robot: 2-WD Autonomer Rover mit Raspberry Pi bauen
- Kommandozeilenargumente in C meistern: Ein praktischer Leitfaden
- C# Interfaces: Verträge für robuste objektorientierte Programmierung
- Stahlband-Spaltanlagen: Präzises Zuschneiden von Coils zu Bändern