www.mikrocontroller.net

Forum: Compiler & IDEs strcmp_P


Autor: Dirk (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: Malte Marwedel (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 :-)

Autor: Dirk (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: mthomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.