If- Bedingung wird nicht wahr

Ich habe folgenden Code:

#define	uchar	unsigned char
uchar serNum[5];
char CardID[20];
char WohnZi[20]= "110-190-163-209-162";

void Setup()
{
.....
}

void loop() 
{
status = MFRC522_Anticoll(str);
memcpy(serNum,str,16);
 if (status == MI_OK)
		{
                snprintf(CardID, 20,"%d-%d-%d-%d-%d", serNum[0], serNum[1], serNum[2], serNum[3], serNum[4]);  
                Serial.println (CardID);  // druckt 110-190-163-209-162 aus!
                Serial.println (WohnZi);  // druckt ebenfalls 110-190-163-209-162 aus!
                if (CardID == WohnZi)   //SB3 im Wohnzimmer
                   {
                      Serial.print("SB3 im Wohnzimmer");   // kommt hier nie an!!!
                   }
.... 
....
}

Es geht um die Bedingung if (CardID == WohnZi) {..}. Beide Variablen sind 20 (19+1) char lang. Die Inhalte sind auch (wenigstens beim Drucken) gleich lang. Für mich müsste die Abfrage mit Wahr beantwortet werden und bei Serial.print ("SB3 im Wohnzimmer); ankommen.

Welchen Denkfehler mache ich?

Eberhard

Lass doch mal Char für Char in einer for-Schleife prüfen und guck, an welcher Stelle es hapert.

War eine gute Idee, aber leider waren beide Inhalte identisch. Ich habe mir die Einzelinhalte extra binär ausgeben lassen, um zu sehen, ob der Null-Terminator da ist. Auch der ist da.

Nun weiß ich wieder nicht weiter.

Gruß
Eberhard

hi,

es gibt zb. verschiedene bindestriche, auch wenn sie gleich aussehen.

gruß stefan

ok, zu spät, das war's nicht....

char* sind gleich, wenn sie auf den gleichen Speicherplatz zeigen.

Du meinst strcmp() statt ==

CardID und WohnZi sind in der Abfrage der Bedingung nicht gleich! Wenn ich auf != prüfe geht's in die If-Bedingung.

Bei einem Vergleich der char[0-19] mit:

for (i=0; i < 20; i++)
{
   if (CardID[i] == WohnZi[i]) Serial.print(i);
}

werden alle i's von 0 bis 19 angezeigt. Ich bin sprach- und ratlos.

Eberhard

Ich bin sprach- und ratlos.

Du bist vielleicht etwas verwöhnt, von == Operatoren und String Objekten.

Lies meinen vorigen Post, und frag dich was strcmp() macht.

Oder schreib:

Serial.println( [b](int) [/b] CardID);
Serial.println( [b](int) [/b] WohnZi);

um den Unterschied zu sehen.

Diese vermaledeiten Zeiger!!

Wenn die '0' als 'wahr' gewertet werden kann, funktioniert es mit folgender Zeile:

 if (strcmp(WohnZi,CardID)==0) Serial.println("SB3 im Wohnzimmer");

Das ist das Los eines Anfängers - tausend Dank!

Eberhard

PS:
Ich vermute jetzt, dass

Serial.println( (int) CardID);
Serial.println( (int) WohnZi);

auf die speicherplätze zeigen, an dem der CardID bzw. WohnZi beginnen. Die zwei Zeilen oben, machen die Sache sehr deutlich, Danke.

Du könntest es auch so machen:

const uchar Wohnzi[5] = {110,190,163,209,162};
uchar serNum[5];

...
memcpy(serNum,str,5);  // Nicht zuviel ( ! ;)

if (status == MI_OK && strncmp(serNum,Wohnzi,5)== 0)
     Serial.print("SB3 im Wohnzimmer");

Controller messen, entscheiden und schalten. Dass sie auch mit Texten umgehen können, ist hübsch, sollte aber auf's Nötigste beschränkt bleiben.

Dein vorschlag endet in meinem Arduino leider mit:

invalid conversion from #unsignes char*' to 'const char*'

Gruß
Eberhard

Dein vorschlag endet in meinem Arduino leider mit:

invalid conversion from #unsignes char*' to 'const char*'

Stimmt, sorry.

strncmp erwartet char*, keine uchar* -> für strncmp also am einfachsten in den ersten 2 Zeilen das u weglassen.

const char Wohnzi[5] = {110,190,163,209,162};
char serNum[5];

besser aber wäre [b]memcmp(serNum,Wohnzi,5);[/b] gewesen.


"Thank you for bringing this to our attention" :slight_smile:

Ich habe mich für Deine vorgeschlagene Variante

besser aber wäre memcmp(serNum,Wohnzi,5); gewesen.

entschieden. Dann muss ich uchar serNum[5] nicht ändern. Das führte nämlich zu weiteren Fehlermeldungen in anderen Programmteilen.

Ich glaube das war's. Dir vielen Dank für die Hilfe.

Gruß Eberhard