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







Zitieren

Lesezeichen