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
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 :-)
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
"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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.