www.mikrocontroller.net

Forum: Compiler & IDEs Stringvergleich funktioniert nicht! Hilfe!


Autor: Christoph G. (booty3009)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo!
Ich habe eine Problem mit dem Stringvergleich beim ATmega8535.
Über ein Terminalprogramm sende ich vom Rechner einen String, der soll 
vom Mikrocontroller empfangen und ausgewertet werden.
Wenn der Befehl CP001200 angekommen ist soll eine LED ausgehen, doch es 
passiert leider nichts.

Wenn ich statt dem Befehl if(strcmp (buffer, "CP001200") == 0)
  {
    PORTA=0x04;
  }
den hier nehme

if(buffer[0] == 67)
  {
    PORTA=0x04;
  }

funktioniert es. Ich schicke über rs232 ein C und E (E steht für das 
Ende des strings), dann geht die LED aus.
Doch bei dem langen String CP001200 passiert nichts!
Kann mir einer weiterhelfen?

Mein Quellcode:

#include <avr/io.h>
#include <avr/interrupt.h>
#include <stdio.h>
#include <string.h>

#define F_CPU 8000000UL             //Frequenz 8 Mhz
#define BAUD      9600UL
#define UBRR_BAUD   ((F_CPU/(16L*BAUD))-1)

char buffer[10];
uint8_t position;
volatile uint8_t habekommando;
void uart_init(void)
{
UBRRH = (uint8_t) (UBRR_BAUD>>8);
UBRRL = (uint8_t) (UBRR_BAUD & 0xFF);
UCSRB = (1<<TXEN) | (1<<RXEN)|(1<<RXCIE);
UCSRC = (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);
}
ISR(USART_RX_vect)
{
  char c = UDR;

  if (c == 'E')
  {
  buffer[position] = '\0';
  habekommando = 1;
  position = 0;

}

else {

  buffer[position] = c;
  position++;

     }
}



int main(void)
{
DDRA = 0xff;
uart_init();
sei();
while(1)  {

  if (habekommando == 1) {
    habekommando = 0;


  if(strcmp (buffer, "CP001200") == 0)
  {
    PORTA=0x04;
  }

  }

}
return 0;
}

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sicher, dass du dich nicht bei den 0-en verzählt hast?
Sicher, dass du das abschliessende E auch wirklich eingegeben hast?

In solchen Fällen ist es immer gut, mal ganz einfach
den ampfangenen String zurückzusenden, damit man am
Terminal kontrollieren kann, ob alles richtig angekommen
ist.
void uart_putc( char c )
{
  while (!(UCSRA & (1<<UDRE)))  /* warten bis Senden möglich                   */
    {
    }
 
    UDR = 'x';
}
 
void uart_puts( const char* String )
{
  while( *String )
    uart_putc( *String++ );
}

.....


int main()
{
  ....
while(1)  {

  if (habekommando == 1) {
    habekommando = 0;

    uart_putc( '#' );
    uart_puts( buffer );
    uart_putc( '#' );

  if(strcmp (buffer, "CP001200") == 0)
  {
    PORTA=0x04;
  }
  ...
}

Ds sendet den String als allererstes gleich mal zurück, wobei
vor und hinter dem String ein '#' ausgegben wird, damit man
auch eingebettete Leerzeichen am Ende und am Anfang sehen kann.

Auf deinem Terminal muss dann also stehen   #CP001200#
Und zwar genau so! Wenn da irgendwelche Leerzeichen oder
Zeilenumbrüche zwischendurch im String enthalten sind,
dann ist bei der Übertragung was faul.

Also erst mal abklären, ob die Übertragung funktioniert hat
und was der AVR konkret empfangen hat.

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ist denn der Inhalt von "buffer" auch wirklich nullterminiert? Ein 
Steuer- oder Leerzeichen am Ende lässt strcmp fehlschlagen. Alternative 
wäre strncmp ...

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Kommt hinter deinem "CP001200" auch ein E?

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.