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; }
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.
Ist denn der Inhalt von "buffer" auch wirklich nullterminiert? Ein Steuer- oder Leerzeichen am Ende lässt strcmp fehlschlagen. Alternative wäre strncmp ...
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.