Problem mit strcmp???

Gast #76459
Hallo,
ich möchte Kommandos über den UART von einem Terminal-Programm
einlesen, die (mit Enter bestätigt eine entsprechende Funktion
aufrufen, aber irgendwie funzt das bei mir nicht, kann mir jemand
weiterhelfen?
        .
        .
        .
  empfangsdaten[i++]=data;

  if (data==('\r'))
    {
      if (strcmp_P(empfangsdaten,"OK")==0){
      uart_puts("OK akzeptiert");
      uart_putc('\r');
      i=0;
      empfangsdaten[0]=0x00;
      }
      else
      {
        uart_puts("UNKNOWN COMMAND ");
        uart_puts(empfangsdaten);
        uart_putc('\r');
        i=0;
        empfangsdaten[0]=0x00;
      }
    }
}
Er gibt immer nur "UNKNOWN COMMAND" aus, mit
uart_puts(empfangsdaten);
zeigt er mir aber genau das Kommando an das er eigentlich bräuchte für
"OK akzeptiert" zu zeigen...
Was mach ich falsch?
Gast #76460
strcmp_P vergleicht einen string mit einem PROGMEM string.
...if (strcmp_P(empfangsdaten,"OK")==0)...
hier ist aber kein string, der im Flash liegt!
-> ...if (strcmp(empfangsdaten,"OK")==0)...
Gast #76461
...if (strcmp(empfangsdaten,"OK")==0)...

hatte ich auch schon versucht, geht leider auch nicht.
Liegt es vielleicht an meiner Definition von

unsigned char empfangsdaten[190]; ???

empfangsdaten wird byteweise über den seriellen Port eingelesen,
190 deshalb weil das längste Kommando 190 Zeichen lang ist.
Gast #76462
190 bytes ist natürlich viel.  Kommt auf den Prozessor an der verwendet
wird.
Aber mir fällt etwas anderes auf:
1. empfangsdaten wird nie "OK" enthalten sondern "OK\r", da ja
data kurz vor dem Vergleich \r ist.
2. strcmp vergleicht bis auf das terminierende \0 das am ende des
Strings stehen muß.  Wo wird der String terminiert ? Steht da wirklich
"OK\r\0" ?
Gast #76463
Ich hatte schon versucht '\0' am ende hinzuzufügen, hat aber auch
nicht funktioniert.

Habe aber jetzt eine Lösung gefunden die funktioniert:

...if (!strncasecmp(empfangsdaten, PSTR("OK"), 2)){...

Vielen Dank für die antworten.
Das mit dem vielen Speicher stimmt natürlich schon, aber ich wüsste
nicht wie ich das anders machen soll?!?
Ist ein ATMega16, der sollte genug Speicher haben, zur Not kriegt er
eben noch einen externen Baustein spendiert.
Gibt es eine Möglichkeit zu erkennen wieviel freien Speicher ich noch
habe?
Gast #76464
Ja, so gehts natürlich, da die NULL oder \r nicht mehr in den Vergleich
einbezogen werden.  "OK" muß aber am Anfang von Empfangsdaten stehen.


Speicher:  avr-size --help
Dies gibt aber keine Antwort bezüglich des Laufzeitsverhalten, da
sich der Stack und Heap annähern.  Kollidieren die beiden gibt es
"lustige" Effekte.
Gast #76465
Hallo,

dein Code funktioniert zwar, aber wenn du z.b. das Kommando okay auch
verwendest so werden beide befehle ausgeführt. Ändere die Routiene,
welche die Daten in den Puffer schreiben:

  data=UDR;

  if (data==('\r'))
    {
      if (strcmp_P(empfangsdaten,"OK")==0){
      uart_puts("OK akzeptiert");
      uart_putc('\r');
      i=0;
      empfangsdaten[0]=0x00;
      }
      else
      {
        uart_puts("UNKNOWN COMMAND ");
        uart_puts(empfangsdaten);
        uart_putc('\r');
        i=0;
        empfangsdaten[0]=0x00;
      }
    }
   else
   {
      empfangsdaten[i++]=data;
   }

also das empfangene Zeichen wird nur in den Empfangsbuffer geschrieben,
wenn es nicht das Enter-Zeichen ist.

Gruß, Florian

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 22 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.