Hallo Kampi!
Meine "ClockTemp" für den Schreibtisch kann so etwas ähnliches. Dabei werden Befehle per Terminal über die UART an den Controller gesendet und ausgewertet. Die Terminalsteuerung übernimmt vollständig der Controller.
Das Prinzip funktioniert so: Wenn eine Taste gedrückt wird, wird das entsprechende Zeichen an den Controller gesendet. Dieser speichert es ab und gibt es an das Terminal wieder aus, damit es auch sichtbar ist. Wird ein CR empfangen (=ENTER auf der Tastatur) wird eine Auswertung gestartet, welche die gespeicherte Zeichenkette zerlegt und zuordnet. Wenn zuviele Zeichen eingegeben werden gibt es eine Fehlermeldung.
Bei meiner Methode muss allerdings der Befehl immer gleich aufgebaut sein. Zum Beispiel:
BEFEHL [leerzeichen] VARIABLE
Ein realer Befehl aus der ClockTemp-Firmware V1.3 lautet:
TIM 2034 --> setze die Uhrzeit auf 20.34 Uhr.
Die Variable nach dem Leerzeichen ist dabei allerdings optional. Ich verwende zum Beispiel STL (ohne Leerzeichen oder sonstiges, einfach nur mit ENTER abschließen) für die Statusausgabe (STL="Status list").
Eine weitere Besonderheit ist, dass der Befehl nur drei Zeichen lang sein darf. Es wird nämlich der String nach fixen Vorgaben zerlegt: Die ersten drei Zeichen sind der auszuführende Befehl, das Leerzeichen wird ignoriert und ab der fünften Stelle im String kommt eine Variable.
Ursprünglich wollte ich die Sache noch etwas weiter entwickeln, allerdings habe ich das Projekt inzwischen abgeschlossen und erfreue mich daran. Im Anhang findest du einen Auszug aus dem Quellcode. Ich habe diese Beschreibung aus Zeitmangel nur schnell zusammengeschrieben, da ich etwas unter Zeitdruck bin aber trotzdem mal einen Lösungsansatz liefern möchte - wenn du Fragen zu meiner Variante hast, dann frag bitte einfach. Warscheinlich ist das jetzt nicht genau die Lösung die du suchst, aber vielleicht konnte ich dir einen Denkansatz geben. Eventuell könnten wir die Sache auch gemeinsam angehen, da mich die Thematik auch interessiert.
Übrigens: Ich weiß, dass diese Eingabemethode vielleicht nicht unbeding elegant und sauber programmiert ist, sie funktioniert allerdings tadellos auf meiner Anwendung und erfüllt ihren Zweck.
Code:
Communication:
Led = 0
Buffer = Inkey() 'Variable "Buffer" mit dem empfangenen Zeichen laden
If Buffer <> Chr(13) Then 'Wenn "Buffer" KEIN ENTER ist, dann an "Eingabe" anreihen
Print Buffer; 'Ausgeben des angereihten Zeichens
Eingabe = Eingabe + Buffer
If Len(eingabe) = 9 Then 'Wenn Eingabe neun Zeichen lang ist, dann abbrechen
Eingabe = "" 'Eingabe = leer
Print
Print "TOO LONG..."
End If
Else 'Wenn "Buffer" ENTER beeinhaltet
Ein_command = Mid(eingabe , 1 , 3) '"Ein_command" = erste drei Zeichen
Ein_value = Mid(eingabe , 5) '"Ein_valaue" = Fünftes bis Achtes Zeichen
Eingabe = "" '"Eingabe" = leer
Print
End If
If Buffer = "°" Then 'Wenn Buffer "Grad"-Zeichen beeinhaltet
Eingabe = "" '"Eingabe" = leer
Print "ABORTED" '"ABORTED" ausgeben
Print "-----"
End If
If Ein_command = "tim" Then 'Eingabe "tim" (Neue Zeit)
Ein_command = Mid(ein_value , 1 , 2) 'Ein_command für Stunde missbrauchen
Stunde = Val(ein_command) 'Direktes Umwandeln der Zeichen
Ein_command = Mid(ein_value , 3 , 2) 'Ein_command für Minute missbrauchen
Minute = Val(ein_command) 'Direktes Umwandeln der Zeichen
Sekunde = 0 'Sekunde auf null setzen
Print "New Time: " ; Stunde ; ":" ; Minute 'Neue Zeit ausgeben
Print "-----"
End If
If Ein_command = "stl" Then 'Eingabe "stl" (Status-List)
Print "Status:"
Print "--------------------"
Print "Voltage in: " ; Volt_single ; "V"
Print "ADC-Value: " ; Volt
Print "Temp MSB: " ; Temp_h
Print "Temp LSB: " ; Temp_l
Print "Temp: " ; Temp_single
Print "Block: " ; Block
Print "Adress: " ; Adresse
Print "Space: " ; Speicher ; "%"
Print "Log-interval: " ; Intervall_soll ; "min"
Print "Interval-Ct: " ; Intervall_ist ; "min"
Print "-----"
End If
If Ein_command = "red" Then Gosub I2c_readtemp 'Eingabe "red" (Log-Lesen und ausgeben)
If Ein_command = "del" Then Gosub I2c_delete 'Eingabe "del" (Löschen)
If Ein_command = "low" Then 'Eingabe "low" (Anzeige letzter Spannungseinbruch)
Print "Last low voltage condition:"
Print "--------------------"
Readeeprom Stunde_read , 1
Readeeprom Minute_read , 2
Readeeprom Sekunde_read , 3
Readeeprom Volt_single , 4
Print Stunde_read ; ":" ; Minute_read ; ":" ; Sekunde_read
Print "Voltage: " ; Volt_single
Print "-----"
Volt_single = 10 'Notlösung: Volt_single auf 10 setzen, damit nicht der falsche Wert angezeigt wird
End If
If Ein_command = "int" Then 'Eingabe "int" (Neues Log-Intervall setzen)
Ein_command = Mid(ein_value , 1 , 3) 'Ein_command missbrauchen
Intervall_soll = Val(ein_command) 'Direktes Umwandeln der Zeichen aus Ein_command
If Intervall_soll >= 1 And Intervall_soll =< 99 Then 'Wenn Intervall innerhalb der zul. Werte
Print "Set new interval: " ; Intervall_soll ; "min"
Print "-----"
Else 'Wenn Intervall ausserhalb der zul. Werte
Print "Not allowed (only 1 to 99 minutes allowed)"
Print "Interval is set to 1 minute"
Print "-----"
Intervall_soll = 1
End If
Intervall_ist = 0
End If
If Ein_command = "inf" Then 'Eingabe "inf" (Info/Help)
Print "Info/Help"
Print "--------------------"
Print "[tim hhmm] : Set Time hh=hours, mm=minutes"
Print "[stl] : Status list"
Print "[red] : Read temperature-log"
Print "[del] : Delete temperature-log (means delete EEPROM)"
Print "[low] : Show last low-voltage-condition"
Print "[int mm] : Set interval for logging (1 to 99 minutes)"
Print "[inf] : You're here! ;-)"
Print "-----"
End If
Ein_command = "" 'Abschließend Ein_command = leer und
Ein_value = "" 'Ein_value = leer
Led = 1
Return
Lesezeichen