strcmp_P

Gast #177544
Lesenswert?
• ▲
▼
Hi,

ich lese einige Char's per Uart ein und lege diese in ein Char Array.
Nach einem "\r" moechte ich den String mit einem String im Flash
vergleichen.

Leider habe ich da meine Probleme.

Mit diesem Befehl funktioniert es.
gleich = strcmp_P(string,PSTR("Measure"));

Versuche ich aber so geht es nicht.

gleich = strcmp_P(string,COMMAND1);

ich hab natuerlich den String im Flash ueber PROGMEM initalisiert.

const char PROGMEM COMMAND1[] = "Measure";

Anbei befindet sich mein Testprg.

Ich hoffe es kann mir jemand weiterhelfen.


Mfg

Dirk
Angehängte Dateien:
Gast #177545
Lesenswert?
• ▲
▼
Auch wenn das deine Frage nicht beatwortet, deklariere die Konstante
COMMAND1 als globale Variable, dann wird PROGMEM nicht mehr ignoriert.
Das spart bei .data 8 Byte und bei .text weitere 12 Byte.

Ansonsten würde ich gerne lernen wie
void uart_str(const char *s) {
    register unsigned char c;
    while ( (c = *s++) ) {
     uart_putchar(c);
    }
}
funktioniert, insbesondere woher die Prozedur weiß die groß der String
ist. Mit Pointern hab ich noch so meine Probleme :-)
Gast #177546
Lesenswert?
• ▲
▼
Hi,

mein erster Fehler war das ich eine zu alte WinAVR Version genutzt
habe. Nachdem ich die Version 3.4.1 installiert hab bekam ich auch eine
Warnung.

Nachdem ich die Zuweisung des Strings als Global gemacht hab
funktioniert es.

Vielen Dank.

So nun zu deiner Frage. Ich bin leider kein Profi in C geschweige AVR
GCC Profi.

Versuchen kann ich es mal:

C wird s zugewiesen. S wird +1 erhoeht und wenn c != 1  ist wird
abgebrochen. Da ein String mit NULL (\0) terminiert wird weiss der
Pointer das der String beendet ist.

Mfg

Dirk
Gast #177547
Lesenswert?
• ▲
▼
"nicht ganz" - die Sache mit dem Abbruch. Versuche es auch mal:
Vor der Schleife (while) zeigt s (ein Pointer) auf eine Speicherstelle,
in der das erste auszugebende Zeichen des Strings steht. Der Ausdruck
bei while "macht" folgendes (1) kopiert den Inhalt der Speicherstelle
(ein "Zeichen") auf das s zeigt in c. Der * steht fuer die
Dereferenzierung. Ist s ein Pointer, also nichts anderes als ein
"Zahl" die einer Speicherstelle entspricht, kann mit *s auf den
Inhalt dieser Speicherstelle zugegriffen werden. (2) s wird nach der
Zuweisung um eins erhoeht (++), der Pointer zeigt somit beim naechsten
Schleifendurchlauf auf die naechste Speicherstelle, also auf das
folgende Zeichen im String. Nun muss man wissen: per Konvention enden
Strings in C mit einem Null-"Zeichen", ein Zeichen (char)
(vereinfacht) auch mit Zahlen verglichen werden kann (verglichen wird
quasi z.B. der ASCII-code des Zeichens) und Bedingungen sind dann
"wahr" wenn das Ergebnis ungleich 0 ist. Damit kommt man zu (3): wenn
das Ergebnis der Zuweisung (also c) ungleich 0 ist (also nicht das
"Endezeichen") wird c ausgegeben (ausgeschrieben (c = *s++) != 0
etwas "eindeutiger" (c=*s++)!='\0').
Nun ja - Prosa in "Epos-Laenge". Hoffe es hilft, Martin

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