Problem mit UART

#3827350
Lesenswert?

Hallo,

wenn ich bei dem folgenden Code das _delay_ms rausnehme bekomme ich 
keinen String mehr zurückgesendet. Woran kann das liegen? Und wieso 
funktionieren die Abfragennicht?
1
#define F_CPU 16000000UL
2

3
#define BAUD 19200UL
4

5
#define UBRR_VAL ((F_CPU+BAUD*8)/(BAUD*16)-1)
6
#define BAUD_REAL (F_CPU/(16*(UBRR_VAL+1)))
7
#define BAUD_ERROR ((BAUD_REAL*1000)/BAUD)
8

9
#if ((BAUD_ERROR<990) || (BAUD_ERROR>1010))
10
  #error Systematischer Fehler der Baudrate grösser 1% und damit zu hoch!
11
#endif
12

13
#include <avr/io.h>
14
#include <util/delay.h>
15
#include <avr/pgmspace.h>
16
#include <avr/interrupt.h>
17
#include "spi.h"
18
#include "uart.h"
19

20
void uart_gets( char* Buffer, uint8_t MaxLen );
21

22
void main(void)
23
{
24
    char buffer[20];
25

26
    DDRA |= (1 << PA2)|(1 << PA3)|(1 << PA4)|(1 << PA6);
27
    PORTA |= (1 << PA2)|(1 << PA3);
28

29
    REMAP = (1<<U0MAP);
30

31
    uart_init(UART_BAUD_SELECT(BAUD,F_CPU));
32

33
    sei();
34

35
    while(1)
36
    {
37
        uart_gets(buffer, 20);
38
        if(buffer[0] != 0x00)
39
            uart_puts(buffer);
40

41
        _delay_ms(100);
42

43
        if(buffer == "A1")
44
            PORTA &= ~(1 << PA2);
45

46
        if(buffer == "A0")
47
            PORTA |= (1 << PA2);
48

49
        if(buffer == "B1")
50
            PORTA &= ~(1 << PA3);
51

52
        if(buffer == "B0")
53
            PORTA |= (1 << PA3);
54

55
    }
56
}
57

58
void uart_gets( char* Buffer, uint8_t MaxLen )
59
{
60
  uint8_t NextChar;
61
  uint8_t StringLen = 0;
62

63
  NextChar = uart_getc();         // Warte auf und empfange das nächste Zeichen
64

65
                                  // Sammle solange Zeichen, bis:
66
                                  // * entweder das String Ende Zeichen kam
67
                                  // * oder das aufnehmende Array voll ist
68
  while( NextChar != '\n' && StringLen < MaxLen - 1 ) {
69
    *Buffer++ = NextChar;
70
    StringLen++;
71
    NextChar = uart_getc();
72
  }
73

74
                                  // Noch ein '\0' anhängen um einen Standard
75
                                  // C-String daraus zu machen
76
  *Buffer = '\0';
77
}
#3827367
Lesenswert?

Mathias O. schrieb:
> wenn ich bei dem folgenden Code das _delay_ms rausnehme bekomme ich
> keinen String mehr zurückgesendet. Woran kann das liegen?

Daran, dass du vermutlich die Fleury-Lib verwendest, und dann der 
Kommentar hier
1
  NextChar = uart_getc();         // Warte auf und empfange das nächste Zeichen
eben nicht stimmt.

Mathias O. schrieb:
> Und wieso
> funktionieren die Abfragennicht?

Weil du in C programmierst und man dort Strings eben nicht auf die Art 
vergleichen kann.
#3827377
Lesenswert?

Stimmt ja. Das kommt davon, wenn man selten in C programmiert.
1
        if(strcmp(buffer, "A1") == 0)
2
            PORTA &= ~(1 << PA2);
3

4
        if(strcmp(buffer, "A0") == 0)
5
            PORTA |= (1 << PA2);
6

7
        if(strcmp(buffer, "B1") == 0)
8
            PORTA &= ~(1 << PA3);
9

10
        if(strcmp(buffer, "B0") == 0)
11
            PORTA |= (1 << PA3);

Aber das andere versteh ich nicht ganz. Was hat das mit dem delay zutun?

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren