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