Dein Ansatz gefällt mir.
Es freut mich, dass Du selbst das Problem lösen willst, statt fertige Codeschnipsel
einzusetzen.
Deinem Code fehlt noch der Stringvergleich, d.h. die Prüfung auf empfangene Befehle.
Um Dir die Suche zu verkürzen: schau mal bei "strcmp" nach. Diese C Funktion vergleicht zwei Strings miteinander.
In Deinem Code hast Du "index" korrekt angewendet, lediglich eines hast Du übersehen:
C Strings sind Nullterminiert. D.h. am Ende eines jeden Strings muss das Byte 0 stehen.
Diese 0 muss selbstverständlich nicht immer am Ende eines Strings stehen, da Du bis zum Eintreffen der ENTER Taste (13) die Variable "index" nutzt, um die Stringlänge zu indizieren.
Deshalb ist es bei Deinem Codebeispiel erst dann notwendig, das Byte 0 an das Ende des Strings zu hängen, bevor Du die Funktion strcmp nutzt (denn diese Funktion verwendet nicht wie Du einen Index für die Identifikation der Stringlänge sondern sucht nach dem Byte 0).
Deshalb wäre es genug, wenn Du nach dem Empfang von 13 das 0 Byte an Deinen String anhängst.
Beispielsweise so:
if (c==13)
{
ch[index]=0;
index=0;
}
In die selbe if Bedingung müsstest Du nun den empfangenen String auf bekannte Befehle hin überprüfen.
Hierfür kannst Du strcmp nutzen. Ein Beispiel:
if (strcmp (ch,"GET TEMP")==0)
{
// Temperatur soll angefragt werden
}
Nähere Infos zu strcmp findest Du im Internet.
Ich vermisse in Deinem Code noch das Setzen von "c". D.h. "c" muss ja das empfangene Byte enthalten, was über die serielle Schnittstelle reinkommt.
Dies machst Du selbstverständlich in der While Schleife.
Bevor die While Schleife beginnt, solltest Du "c" unbedingt auf einen Wert ungleich 13 setzen, sonst wird beim nächsten Durchlauf nicht mehr in die While Schleife gesprungen, da "c" ja noch vom letzten Durchlauf 13 enthält.
Das "if (c==13)" kannst Du Dir eigentlich sparen, denn c ist immer 13, wenn die While Schleife verlassen wird (sofern Du kein break einsetzt).
Dein Compiler wird diese Zeile ohnehin löschen sofern er kein break in der While Schleife findet (die sogenannte Code Optimierung).
Wenn Du Deinen Code sicherer machen möchtest: sei so gut und prüfe die Anzahl der Empfangenen Zeichen auf die Anzahl der Zeichen, die in Deinen String "ch" hineinpassen.
Wie ich sehe hat dein Array/String platz für 19 Zeichen (das 20. enthält später das Byte mit dem Wert 0!).
ACHTUNG: die Zählung beginnt bei 0! D.h. index darf Werte von 0 bis einschließlich 19 annehmen.
Noch ein Hinweis zu Deiner While Schleife:
Du verwendest eine While Schleife zum Abfragen auf das Eintreffen der ENTER Taste.
Dies würde bedeuten, dein Prozessor ist solange mit nichts anderes beschäftigt als Zeichen zu empfangen, bis die ENTER Taste eintrifft.
Ansich nichts schlechtes, sofern Dein Prozessor keine Ausgänge ansteuert, wie beispielsweise die Aquarium Heizung.
D.h. solange die "13" nicht empfangen wurde, bleiben alle Ausgänge wie sie waren.
Sofern der Prozessor aber AUCH automatisch / selbstständig die Heizung oder Pumpe ein/ausschalten soll, ist diese vorgehensweise nicht klug.
Lesezeichen