strcmp_P für einzelne chars eines Strings

Gast #2249900
Lesenswert?

Hallo zusammen,

ich sitze an einem Programm in AVR-GCC, das über die serielle 
Schnitstelle bei bestimmten Befehlen Portpins schalten soll.

Der Vergleich kompletter Strings funktioniert, also z.B. folgendes:

if (!strcmp_P (stringbuffer, PSTR ("\n\rHallo_alle"))) // funktioniert

genauso auch:

static char Empfang_test[13] PROGMEM = "\n\rHallo_alle";
if (!strcmp_P (stringbuffer, Empfang_test)) // funktioniert



Was nicht funktioniert ist der Vergleich einzelner Zeichen:

static char Empfang_test[13] PROGMEM = "\n\rHallo_alle";
if (!strcmp_P (stringbuffer[3], Empfang_test[3])) // funktioniert nicht

Das brauche ich z.B. um diesen String auf ein "Hallo" zu testen. Den 
Test auf ein "Hallo" würde ich dann so realisieren:
if (!strcmp_P(stringbuffer[3],Empfang_test[3]) && 
!strcmp_P(stringbuffer[4],Empfang_test[4])) && .. ) usw.
(Mit der Beschreibung auf 
http://www.nongnu.org/avr-libc/user-manual/group__avr__pgmspace.html#gae3a7686c2e207b543be3b402d919761a 
durschaue ich das Problem noch nicht)

Warum funktioniert der Vergleich nicht für einzelne Zeichen in einem 
String?
Gast #2249926
Lesenswert?

Genial! Vielen Dank rr, memcmp_P löst mein Problem.
Vielen Dank Klaus für das Wissen. Das behalte ich mal im Hinterkopf, 
dann könnte strcmp_P mit einem String mit einer künstlich eingefügten \0 
verwendet werden. Das erweist sich als nützlich :)
Persönliche Seite #2249972
Lesenswert?

Du willst einzelne Zeichen vergleichen?

Warum dafür strcmp verwenden? Du musst nur die Zeichen der beiden 
Strings direkt miteinander vergleichen:

Statt

  if (!strcmp_P (stringbuffer[3], Empfang_test[3])) // funktioniert 
nicht

also

  if (stringbuffer[3] == Empfang_test[3])

Wegen der praktischen AVR-Architektur geht das natürlich so nicht, den 
Zugriff auf den im Flash gespeicherten String musst Du noch hinzufügen:


  if (stringbuffer[3] == pgm_read_byte(&Empfang_test[3]))

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