Forum: Compiler & IDEs Stringvergleich funktioniert nicht! Hilfe!


von Christoph G. (booty3009)


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;
}

von Karl H. (kbuchegg)


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.
1
void uart_putc( char c )
2
{
3
  while (!(UCSRA & (1<<UDRE)))  /* warten bis Senden möglich                   */
4
    {
5
    }
6
 
7
    UDR = 'x';
8
}
9
 
10
void uart_puts( const char* String )
11
{
12
  while( *String )
13
    uart_putc( *String++ );
14
}
15
16
.....
17
18
19
int main()
20
{
21
  ....
22
while(1)  {
23
24
  if (habekommando == 1) {
25
    habekommando = 0;
26
27
    uart_putc( '#' );
28
    uart_puts( buffer );
29
    uart_putc( '#' );
30
31
  if(strcmp (buffer, "CP001200") == 0)
32
  {
33
    PORTA=0x04;
34
  }
35
  ...
36
}

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.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

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

von Rolf Magnus (Gast)


Lesenswert?

Kommt hinter deinem "CP001200" auch ein E?

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.