if (strcmp(c, "LCDaus") == 0) wird nicht ausgeführt

Hallo,
das wird über seriell übertragen:

INcTST = INcT ;
  char LCDINcTST[15];
  dtostrf(INcTST, 4, 1, LCDINcTST);
  Serial3.print(LCDINcTST);
  Serial3.print('\n');

das wird am Empfänger über den seriellen Monitor ausgegeben:

21.8

alles gut.
Dann wird auch das übertragen:

if (digitalRead(SDC) == HIGH)

      {
           Serial3.print("LCDan");
      Serial3.print('\n');
}

das wird am Empfänger über den seriellen Monitor ausgegeben:

LCDan

alles gut.
Am Empfänger läuft folgendes:

bool readSerial(Stream& stream)
{
  static byte index;

  while (stream.available())
  {
    char c = stream.read();
    Serial.print(c);


    if (c >= 32 && index < SERIAL_BUFFER_SIZE - 1)//Werte
    {
      serialBuffer[index++] = c;


      if (strcmp(c, "LCDaus") == 0)
      {
        digitalWrite(LcdHbXBee, HIGH);

        Serial.println(" aus");

      }

      if (strcmp(c, "LCDan") == 0)
      {
        digitalWrite(LcdHbXBee, LOW);

        Serial.println(" an");

      }
    }


    else

      if ((c == '\n' || c == '\r') && index > 0)

      {
        serialBuffer[index] = '\0';

        if ( c == '\n')
        {
          zln++;
        }

        if (zln == 6)//6
        {
          zln = 0;//1
        }

        index = 0;//0
        return true;
      }
  }
  return false;
}

Warum funktioniert das nicht? Was übersehe ich da?

if (strcmp(c, "LCDan") == 0)
      {
        digitalWrite(LcdHbXBee, LOW);

        Serial.println(" an");

      }

Übersehe ich da Steuerzeichen?
Gruß und Dank
Andreas

Häng mal ein '\n' an, das sendest du schließlich mit. Außerdem musst du schon mehr als nur ein Zeichen empfangen, wenn du strcmp benutzen willst...

@SkobyMobil: Wenn Du Dir nicht sicher bist, welche Zeichen da noch so kommen, lass es Dir einfach in HEX ausgeben. Da siehst Du die Steuerzeichen.

Gruß Tommy

      serialBuffer[index++] = c;

      if (strcmp(c, "LCDaus") == 0)

Wie kommst du darauf, dass man Zeichen als Adresse eines C-Strings nutzen sollte?

Wenn du wissen willst ob im Buffer etwas steht wäre da nicht vielleicht

      if (strcmp(serialBuffer, "LCDaus") == 0)

sinnvoller?

Hallo,
" lass es Dir einfach in HEX ausgeben"

Das hätte ich auch selbst drauf kommen können. Tommy- schönen Dank dafür.

Vielen Dank für eure Mühe.
Gruß und Spaß
Andreas

SkobyMobil:
Hallo,
" lass es Dir einfach in HEX ausgeben"

Das hätte ich auch selbst drauf kommen können. Tommy- schönen Dank dafür.

Vielen Dank für eure Mühe.
Gruß und Spaß
Andreas

Du hast schon bemerkt dass mein Post aus zwei Fragen bestand?

Antwortest du nicht jedem?

Sollte dein Fehler nicht auch ein Warning produzieren?
Kann ich ja nicht verifizieren, da du keinen kompilierbaren Kode gepostet hast.

Warum hast du den nicht zutreffenden Titel " if (strcmp(c, "LCDaus") == 0) wird nicht ausgeführt" gewählt?
Wo du doch nur wissen willst, warum der Vergleich anders als erwartet ausfällt?

Ach, Whandall

ich habe Deine zwei Fragen schon bemwerkt.

Wie kommst du darauf, dass man Zeichen als Adresse eines C-Strings nutzen sollte?

serialBuffer[index++] = c;
if (strcmp(c, "LCDaus") == 0)

diesen Vergleich hat mir einmal jemand aus dem Forum gesteckt.
Der funktioniert in einem anderem Sketch einwandfrei.
Nur hier hat er nicht funktioniert, weil ich bei LCDan etwas anderes gesendet
habe, als bei LCDaus.

Wenn du wissen willst ob im Buffer etwas steht wäre da nicht vielleicht
if (strcmp(serialBuffer, "LCDaus") == 0)
sinnvoller?
Ja, das ist sinnvoller. Das von mir gepostete ist der letzte Versuch gewesen.
Ich habe die Faxen so etwas von dicke...

Nein, eine Warnung gibt es nicht, läuft sauber durch.

"Warum hast du den nicht zutreffenden Titel..."

Wohl etwas unglücklich gewählt.

Jetzt mal was ich habe, und das gefällt mir noch nicht so richtig.
Ich sende u.a.

INcTST = INcT ;
  char LCDINcTST[15];
  dtostrf(INcTST, 4, 1, LCDINcTST);
  Serial3.print(LCDINcTST);
  Serial3.print('\n');

das ist ein float 21.8
auf der EmpfängerSeite kommt als char dann 21.8 an.

Dann wird auch u.a. dieses gesendet:

if (digitalRead(SDC) == HIGH)

      {
           Serial3.print("LCDan");
      Serial3.print('\n');
}

Das ist nur eine Nachricht in "EchtWelcheFunktionText"
Das funktionier so leidlich.
Der knallt mir noch in mein WerteChar ein.

ich hoffe ich habe nichts vergessen...

const int SERIAL_BUFFER_SIZE = 18;
char serialBuffer[SERIAL_BUFFER_SIZE];
char SWert01[7];
char SWert02[7];
char SWert03[7];
char SWert04[7];
char SWert05[7];
char SWert06[7];

int zln;
int zlAuto;
int Y;
int i;
int zlTest;

unsigned long LCDSeiteIntervall = 5000;
long LCDSeiteStartMillis;
int LCDSeiteZaehler = 1;
int Modulo;


void loop()
{
  if (readSerial(Serial3) == true)
  {

  }
  if (zlAuto == 1)
  {
    if (millis() - LCDSeiteStartMillis > LCDSeiteIntervall)
    {
      LCDSeiteStartMillis = millis();
      LCDSeiteZaehler++;
      Modulo = LCDSeiteZaehler % 2;
      if (Modulo == 0)
      {
        LCDA();
      }

      else

      {
        LCDB();
        LCDSeiteZaehler = 1;
      }
    }
  }


}

bool readSerial(Stream& stream)
{
  static byte index;

  while (stream.available())
  {
    char c = stream.read();
    Serial.print(c);


    //***************************************     Werte Empfang     ***************************
    if (c >= 32 && index < SERIAL_BUFFER_SIZE - 1)//Werte
    {
      serialBuffer[index++] = c;


      if (strcmp(serialBuffer, "LCDaus") == 0)
      {
        digitalWrite(LcdHbXBee, HIGH);
        zln = 6;
        delay(100);
        Serial.println(" aus");

      }

      if (strcmp(serialBuffer, "LCDan") == 0)
      {
        digitalWrite(LcdHbXBee, LOW);
        zln = 6;
        delay(100);
        Serial.println(" an");

      }


      else  if (zln == 0)
      {
        SWert01[index - 1] = c;
      }

      else if (zln == 1)

      {
        SWert02[index - 1] = c;
        Y = index;
      }

      else if (zln == 2)

      {
        SWert03[index - 1] = c;
      }

      else if (zln == 3)

      {
        SWert04[index - 1] = c;
      }

      else if (zln == 4)
      {

        SWert05[index - 1] = c;
      }

      else if (zln == 5)

      {
        SWert06[index - 1] = c;
        zlAuto = 1;
      }

    }
    else

      if ((c == '\n' || c == '\r') && index > 0)

      {
        serialBuffer[index] = '\0';

        if ( c == '\n')
        {
          zln++;
        }

        if (zln == 6)//6
        {
          zln = 0;//1
        }

        index = 0;//0
        return true;
      }
  }
  return false;
}
//-----------------------------------------------------------------------------
void LCDA()//Display Seite A
{
  lcd.clear();
  lcd.setCursor(8, 0);
  lcd.print(TextUEA);

  lcd.setCursor(8, 2);
  lcd.print(SWert01);
  lcd.print(" ");
  lcd.write(GradSym);
  lcd.print("C");


  if (Y == 4)
  {
    lcd.setCursor(24, 2);
  }
  else
  {
    lcd.setCursor(23, 2);
  }

  lcd.print(SWert03);
  lcd.print(" ");
  lcd.write(GradSym);
  lcd.print("C");

  lcd.setCursor(8, 3);
  lcd.print(SWert02);
  lcd.print(" rF%");

  lcd.setCursor(24, 3);
  lcd.print(SWert04);
  lcd.print(" rF%");

}

//-----------------------------------------------------------------------------------------------------------------
void LCDB()//Display Seite B
{
  lcd.clear();
  lcd.setCursor(17, 0);
  lcd.print(TextUEB);

  lcd.setCursor(8, 2);
  lcd.print(SWert05);
  lcd.print(" ppm");

  lcd.setCursor(22, 2);
  lcd.print(SWert06);
  lcd.print(" hPa");
}

sollte alles sein.

in diese Dinger knallt er mir noch die LCDan/LCDaus rein.

else  if (zln == 0)
      {
        SWert01[index - 1] = c;
      }

      else if (zln == 1)

das liegt aber an dem Zähler, das bekomme ich hin.
Am liebsten wäre es mir, einfach int\n und ASCII\n zu übertragen.
Über einen \n Zähler könnte ich die Werte zuordnen und auch den
ASCII auswerten.
So wie es jetzt ist bekomme ich es zum laufen, aber ich glaube es ist der
letzte Dreck- mir gefällt es nicht.
Gruß und Dank
Andreas

SkobyMobil:
serialBuffer[index++] = c;
if (strcmp(c, "LCDaus") == 0)

diesen Vergleich hat mir einmal jemand aus dem Forum gesteckt.
Der funktioniert in einem anderem Sketch einwandfrei.

Nein, funktioniert hat er nie, vielleicht zufällig das richtige Ergebnis geliefert.

SkobyMobil:
Nur hier hat er nicht funktioniert, weil ich bei LCDan etwas anderes gesendet
habe, als bei LCDaus.

Nein, das ist sicher nicht der Grund.

Die beiden Parameter von strcmp sind char*, wenn man da einen char benutzt kann das nicht funktionieren.

SkobyMobil:
Nein, eine Warnung gibt es nicht, läuft sauber durch.

Dann hast du deine Warnungen abgestellt, keine gute Idee.

Somewhere\WirklichKeinWarning\WirklichKeinWarning.ino: In function 'void setup()':

Somewhere\WirklichKeinWarning\WirklichKeinWarning.ino:7:25: warning: invalid conversion from 'char' to 'const char*' [-fpermissive]

   if (strcmp(c, "LCDaus") == 0) {

                         ^
arduino15\packages\arduino\tools\avr-gcc\5.4.0-atmel3.6.1-arduino2\avr\include\string.h:287:12: note:   initializing argument 1 of 'int strcmp(const char*, const char*)'

 extern int strcmp(const char *, const char *) __ATTR_PURE__;

            ^
char serialBuffer[2];
char c = 's';

void setup() {
  Serial.begin(250000);
  serialBuffer[0] = c;
  if (strcmp(c, "LCDaus") == 0) {
    Serial.println(F("Ja, ist gleich."));
  }
}
void loop() {}

Na Meister, Guten Morgen

die Fehlermeldungen sind bei mir nicht off. Ich bekomme keine Fehlermeldung zum Syntax des Sketch. Der läuft so durch.
Wie auch immer, das ganze Gemurkse werde ich einmal neu aufbauen. Ich brauche da irgendwie Zahlen und Ziffern.
ASCII sollte ich extra auswerten. Eigentlich halte ich es für blödsinnig eine Ziffer/Zahl zum char zu machen und dann wieder
zurück zur Zahl/Ziffer. Ja, ja, die serielle Kommunikation....
Gruß und Spaß
Andreas

Der seriellen Kommunikation ist es völlig egal, ob Du das, was Du sendest als ASCII, Char oder binäre Zahlen interpretierst. Das entscheidest allein Du.

Gruß Tommy

SkobyMobil:
die Fehlermeldungen sind bei mir nicht off. Ich bekomme keine Fehlermeldung zum Syntax des Sketch. Der läuft so durch.

Ich biete Win 7 mit IDE 1.8.7 und du?

Hallo Tommy,
das ist schon richtig, trotzdem gefällt es mir nicht. Das ist umständlicher Mist, den ich mir da ausgedacht habe.
Gruß und Spaß
Andreas

Hallo,
Win 7 mit 1.6.13.
läuft die 1.8.7 stabil auf dem System. Ich bin mit "neuen" Versionen immer sehr, sehr vorsichtig.
Gruß und Spaß
Andreas

Ich hatte lange die 1.8.5 habe aber auch mit 1.8.7 keine negativen Erfahrungen gemacht.

Wenn 1.6.13 bei dem Kode kein Warning produziert würde ich upgraden.

Die neue beta Version soll Autocompletion haben, ist mir aber bisher noch zu beta gewesen.

Hallo,
so- das mit den Werten läuft.

Wenn sich an der Seriellen etwas rührt, dann wird nachfolgendes aufgerufen:

bool readSerial(Stream& stream)

{

  while (stream.available())
  {
    char c = stream.read();


    if (isDigit(c))
    {
      Wert = (Wert * 10) + (c - '0');
    }

    else if  (c == 10)

    {
      Wert = 0;
      zln++;
    }


    if (zln == 0)
    {
      SWert01 = Wert / 10;
    }

    else if (zln == 1)

    {
      SWert02 = Wert / 10;
    }

    else if (zln == 2)

    {
      SWert03 = Wert / 10;
    }

    else if (zln == 3)

    {
      SWert04 = Wert / 10;
    }

    else if (zln == 4)
    {

      SWert05 = Wert;
    }

    else if (zln == 5)

    {
      SWert06 = Wert / 10;
      zlAuto = 1;

    }


    if (zln == 6)
    {
      zln = 0;
    }
    return true;

  }
  return false;
}

Das funktioniert tatsächlich nicht so richtig sicher:

   if (strcmp(serialBuffer, "LCDaus") == 0)
  {
   digitalWrite(LcdHbXBee, HIGH);
  }

Wie muß ich hier denn auf "LCDaus" abfragen, das das auch sicher funktioniert?
Gruß und Dank
Andreas

Das kommt darauf an, was da alles drin steht. Wenn serialBuffer mit "LCDaus" beginnt, könntest Du Dir strncmp anschauen, wenn es irgendwo darin steht strstr.

Gruß Tommy

Guten Morgen Tommy,
das kannte ich noch nicht. Mal sehen ob ich es verwende.
Ich hänge hier schon die ganze Nacht an der Seriellen rum. Hier haut etwas mit der Auswertung überhaupt nicht hin.
Dieses verdammte "LCDan" knallt mir immer in die Werte rein. Ich schreibe mir das jetzt von Anfang an neu.
Eigentlich hatte ich ja gedacht das ich diesen seriellenDreck gefressen habe, habe ich auch- aber nicht im Kopf.
Das kann doch wohl nicht so schwer sein...
Vielen Dank für den Tip.
Gruß und Spaß
Andreas

Hallo,
so- es läuft fehlerfrei. Wie ich es gemacht habe?

Arduino Kochbuch, Serielle Kommunikation.
In Ruhe durchgelesen und abgearbeitet. Geht doch :slight_smile:
DAS Buch ist mit Geld nicht zu bezahlen.
Also, vielen Dank
Gruß und Spaß
Andreas