Stringvergleich funktioniert nicht! Hilfe!

OP #720095
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;
}
#720124
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.

Antwort schreiben

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.

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.