char-Array auf Inhalt prüfen (oder so)

Gast #2319302
Lesenswert?

Hallo hallo,

ich hab mal wieder ein Problem mit der ordentlichen Struktur meines 
C-Codes und würde gern wissen, wie es besser gemacht werden kann.

Ich mache z.Z. folgendes: ich sende eine Zeichenkette vom PC via UART an 
einen Microcontroller (Atmega88). Der soll dann erkennen, ob die 
Zeichenkette einen gültigen Befehl enthält.

Zum Empfangen des Arrays hab ich erstmal den Code aus dem Tutorial 
genommen. Es werden also solange Zeichen empfangen, bis entweder "Enter" 
gesendet wurde, oder mein Array voll ist.

Jetzt mach ich das z.Z. so:
1
if((buffer[0] == 'c') && (buffer[1] == 'o') && (buffer[2] == 'm') und so weiter)
2
{
3
// mach irgendwas
4
}

Das muß ich dann aber für jeden Befehl den es geben soll und dafür 
auchnoch für jedes Arrayelement einzelnd machen. Das find ich echt 
unsouverän. Ich hab auch diesen "strcmp()"-Befehl gefunden. Da bezweifel 
ich aber, daß der für die Ausführung auf einem µC optimiert ist.

Gibt es eine bessere Möglichkeit meinen Befehl aus dem Array raus zu 
filtern? Zum Beispiel so in der Art:
1
if(buffer[] == "com sollwert 5")
2
{
3
// Sollwert auf 5 setzen
4
}
5

6
else if(buffer[] == "com send istwert")
7
{
8
// sende den Istwert raus
9
}

Was ist für sowas die beste (Code- und Speicher-optimalste) 
Vorgehensweise?
Würde mich auch schon helfen, wenn einer weiß, wo ich das nachlesen kann 
:)

Gruß,
Joachim
Gast #2319343
Lesenswert?

Hallo und danke für die Antwort!

adad schrieb:
> Gut.

hoho, danke ;) !

Also, daß mein "manueller character-Vergleich" nicht gerade dolle ist, 
weiß ich ja selbst.

Mit
> Da bezweifel
> ich aber, daß der für die Ausführung auf einem µC optimiert ist.

meinte ich, daß es ja in C viele Befehler gibt, die zwar funktionieren, 
aber verhältnismäßig Ressourcen-fressend sind (wie z.B. printf(), 
scanf()). Es war auch kein wirklicher "Schluß" von mir, sondern eher 
eine Vermutung unfgrund von Vergleichen mit anderen Befehlen :) .
Ich wollt einfach gern hören, ob es für diese Anwendung im Bereich µCs 
sowas wie eine bevorzugte Vorgehensweise gibt. Ich bin ja bestimmt nicht 
der erste, der sowas machen will :) .

Gruß
Persönliche Seite #2319400
Lesenswert?

Joachim schrieb:
> meinte ich, daß es ja in C viele Befehler gibt, die zwar funktionieren,
> aber verhältnismäßig Ressourcen-fressend sind (wie z.B. printf(),
> scanf()).

Die beiden sind das auch, aber die Stringhandling-Funktionen gehören 
nicht in diese Kategorie. Die dürften sogar in den üblichen Libraries so 
gut optimiert sein, daß handgedengelter Code nicht dagegen anstinken 
kann.
Gast #2319414
Lesenswert?

strcmp() ist überhaupt nicht kompliziert.

Darin ist eine Schleife über den String und noch ein Vergleich.

printf() und scanf() sind so fett, das sie ja auch noch die Auswertung 
vom Formatstring machen müssen.
1
int strcmp(const char *s1, const char *s2)
2
{ for (; *s1==*s2; ++s1, ++s2)
3
    if (*s1 == '\0')
4
      return 0;
5
  return (*s1-*s2);
6
}
oder so.
Gast #2319484
Lesenswert?

@Rufus

Ok, danke für die Info. Also wäre es doch die bessere Vorgehensweise 
diese "strcmp()" oder "strncmp()" Funktionen zu benutzen, richtig?

Ich lese grad parallel dazu ein bißchen nach. Vielleicht wäre dann eine 
Kombination aus "strcspn()" und "strncmp()". Dann würde ich mit 
strcspn() gucken, an welcher Stelle mein "Befehl-Ende-Zeichen" steht, 
und das könnte ich dann wiederum für die Funktion strcspn() benutzen, 
damit nur eine bestimmte Anzahl von Zeichen verglichen werden (meine 
Befehle können ja unterschiedlich lang sein).

Danke nochmal,
Gruß

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren