Zeichenkette in if abfrage

Hallo zusammen,

Ich erhalte von meinem ATtiny über Funk eine Zeichenkette. Dies Funktioniert auch.

  uint8_t buf[VW_MAX_MESSAGE_LEN];
  uint8_t buflen = VW_MAX_MESSAGE_LEN;

  if (vw_get_message(buf, &buflen)) // Non-blocking
  {
    int i;
    // Message with a good checksum received.

    for (i = 0; i < buflen; i++)
    {
      Serial.print((char)buf[i]);        // the received data is stored in buffer
    
      Serial.println("");
    }
  }

Nun möchte ich diese Zeichenkette überprüfen:
if (buf == “hallo”) {

  • Serial.print(“OK”);*
  • }*
    Nur krieg ich das nicht auf die Reihe.

Da Arrays in C nur Zeiger auf das erste Element sind, kannst du die nicht mit == vergleichen. Mit == überprüfst du nur ob die Adressen gleich sind. Was in diesem Fall natürlich nicht zutrifft.

C Strings werden mit strcmp() verglichen (string compare): http://www.cplusplus.com/reference/cstring/strcmp/ Die Funktion gibt bei Gleichheit 0 zurück

Also:

if (strcmp(buf, "hallo") == 0) 
{
  Serial.print("OK");
}

Oder damit der Vergleichs-String kein RAM belegt:

if (strcmp_P(buf, PSTR("hallo")) == 0) 
{
  Serial.print("OK");
}

Es gibt auch strcasecmp() um die Groß-/Kleinschreibung zu ignorieren: http://www.nongnu.org/avr-libc/user-manual/group__avr__string.html#gaea3f5ad280b6d689b5f9937ef6f0d805

Leider erscheint folgender Fehler: invalid conversion from 'uint8_t* {aka unsigned char*}' to 'const char*' [-fpermissive]

an was liegt das :s

Weil das als byte Array definiert ist und nicht als char Array. Mach einen Cast auf char* ähnlich wie hier:

Serial.print((char)buf[i]);

Also:

if (strcmp((char*)buf, "hallo") == 0)

Leider finde ich den fehler nicht … sorry hab noch nie mit “Zeichenketten” gearbeitet

Aber eigentlich sollte dies doch Funktionieren:

#include <VirtualWire.h>

#define rxPin 12
#define ledPin 13

void setup() {
  Serial.begin(9600);

  pinMode(ledPin, OUTPUT);

  vw_set_ptt_inverted(true);
  vw_set_rx_pin(rxPin);
  vw_setup(100); // Bits per sec
  vw_rx_start();
}

void loop() {
  uint8_t buf[VW_MAX_MESSAGE_LEN];
  uint8_t buflen = VW_MAX_MESSAGE_LEN;

  if (vw_get_message(buf, &buflen)) // Non-blocking
  {
    int i;
    // Message with a good checksum received.

    for (i = 0; i < buflen; i++)
    {
      Serial.print((char)buf[i]);                     // the received

    }
    Serial.println("");

  }

  if (strcmp((char*)buf, "Testnachricht") == 0) {
    {
      Serial.print("OK");
    }

  }
}

Bist du sicher dass der String korrekt terminiert ist? Mach mal statt der for-Schleife beim Empfang das:

Serial.println((char*)buf);

Damit siehst du eher ob es passt. Wenn dabei Unsinn raus kommt (d.h. es wird zu viel angezeigt weil der Terminator nicht passt), stelle sicher, dass beim Senden auch der Null-Terminator übertragen wird. Also ein Zeichen mehr senden.

Eine andere Option wäre memcmp() oder strncmp(). Da musst du aber die Anzahl der zu vergleichenden Bytes mit angeben.

Hallo du hast es erfasst, es kommt nur "scheisse" an xD...

achrichp]$=!½ÿöûÖúò¥··û«OfÓûu«BUwû nachrichp]$=!½ÿöûÖúò¥··û«OfÓûu«BUwû nachrichp]$=!½ÿöûÖúò¥··û«OfÓûu«BUwû nachrichp]$=!½ÿöûÖúò¥··û«OfÓûu«BUwû

Aber warum den dass? :s

Aber warum den dass? :s

Serenifly:
es wird zu viel angezeigt weil der Terminator nicht passt

Das letzte Zeichen eines Textes ist eine 0 als Endekennung

Ich rate mal, das Problem liegt in

vw_get_message(buf, &buflen)

bzw. seiner Verwendung.

Danke,

Kennst du auch einen Weg wie ich das ändern muss das es Funktioniert:s

Ich glaube der Fehler liegt eher beim Senden. Verwendest du strlen() um die Anzahl der zu sendenden Bytes zu bestimmen? Wenn ja, mach da mal + 1 damit der Terminator mitgesendet wird.

Ich hab das ding mal Ruhen lassen, die Textnachricht mit Zahlen ersetzt und nun Funktioniert es:

#include <VirtualWire.h>

#define rxPin 12
#define ledPin 13

void setup() {
  Serial.begin(9600);

  pinMode(ledPin, OUTPUT);

  vw_set_ptt_inverted(true);
  vw_set_rx_pin(rxPin);
  vw_setup(100); // Bits per sec
  vw_rx_start();
}

void loop() {
  uint8_t buf[VW_MAX_MESSAGE_LEN];
  uint8_t buflen = VW_MAX_MESSAGE_LEN;

  if (vw_get_message(buf, &buflen)) // Non-blocking
  {
    int i;
    // Message with a good checksum received.

    for (i = 0; i < buflen; i++)
    {
      Serial.print((char)buf[i]);                     // the received

    }
    Serial.println("");
        if (strcmp((char*)buf, "58426454") == 0) {
      {
        Serial.println("OK");
      }
    }



  }
}

Kann mir jemand erklären warum dies läuft :s

Ich glaube der Fehler liegt eher beim Senden.

Kann auch sein, aber darüber verrät schnibli nichts.

Auch Empfängerseite geht auch:

void loop() {
  uint8_t buf[VW_MAX_MESSAGE_LEN+1];  // max 30 Zeichen + Endekennung
  uint8_t buflen = VW_MAX_MESSAGE_LEN;

  if (vw_get_message(buf, &buflen)) // Non-blocking
  {
     Serial.print(buflen); Serial.println( " bytes empfangen");

     buf[buflen]=0; // Endekennung 
     Serial.println((char*)buf);

     if (strcmp((char*)buf, "Testnachricht") == 0)
     {
          Serial.println("OK");
     }
  }
}

Das geht natürlich nur, wenn kurze Texte ( egal ob "hallo", "Testnachricht", oder "58426454" ) übertragen werden, nicht bei Binärdaten.