mikrocontroller.net

Forum: Compiler & IDEs Problem mit strcmp???


Autor: Björn Hayer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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?

Autor: Reiner (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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)...

Autor: Björn Hayer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
...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.

Autor: Reiner (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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" ?

Autor: Björn Hayer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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?

Autor: Reiner (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Florian Pfanner (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.