Forum: Compiler & IDEs char-Array auf Inhalt prüfen (oder so)


von Joachim (Gast)


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

von adad (Gast)


Lesenswert?

Joachim schrieb:
> Ich hab auch diesen "strcmp()"-Befehl gefunden.

Gut.


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

Wie kommst du zu diesem Schluss? Was verstehst du unter "auf einem µC 
optimiert ist"? Und optimiert im Vergleich zu was? Deinen manuellen, 
einzelnen charachter-Vergleichen?

von Joachim (Gast)


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ß

von Rufus Τ. F. (rufus) Benutzerseite


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.

von DirkB (Gast)


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.

von Joachim (Gast)


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ß

von Joachim (Gast)


Lesenswert?

Joachim schrieb:
> an welcher Stelle mein "Befehl-Ende-Zeichen" steht,
> und das könnte ich dann wiederum für die Funktion strcspn() benutzen,

Ups, ich meinte natürlich "strncmp()"

@Dirk
Hab deinen Post erst jetzt gesehen, sorry. Danke dir für die Aufklärung 
:)

von Andreas B. (andreas_b77)


Lesenswert?

Da ist auch noch anzumerken, dass GCC strcmp (und viele andere einfache 
Standard-Funktionen von C) als eingebaute Funktion bietet und so noch 
weiter optimieren kann als bei einem Funktionsaufruf möglich wäre.

von StinkyWinky (Gast)


Lesenswert?

Wenn sich die Befehle in Kategorien einteilen lassen, dann braucht man 
nicht immer den ganzen Befehl zu vergleichen, sondern kann sich 
häppchenweise heran tasten.

Beispiel

"com set sollwert 5"
"com set bla 34"
"com set blupp 23"

"com send istwert"
"com send sollwert"
"com send fehler"

"spi set irgendwas 4"
...

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.