Forum: Mikrocontroller und Digitale Elektronik Problem mit UART


von Mathias O. (m-obi)


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
}

von Stefan E. (sternst)


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.

von Mathias O. (m-obi)


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?

von Stefan E. (sternst)


Lesenswert?

Mathias O. schrieb:
> Aber das andere versteh ich nicht ganz. Was hat das mit dem delay zutun?

Ach komm, so schwer ist das jetzt auch nicht. Der Kommentar enthält doch 
nur zwei Aussagen. Welche davon könnte es wohl sein, die nicht stimmt 
und durch das Delay "repariert" wird?

von Mathias O. (m-obi)


Lesenswert?

Ach man muss warten, damit er was empfangen kann?

von Stefan E. (sternst)


Lesenswert?

Mathias O. schrieb:
> Ach man muss warten, damit er was empfangen kann?

Der Controller kann ja nicht in die Zukunft schauen. Natürlich muss man 
irgendwie darauf warten, dass tatsächlich etwas empfangen wurde. Genau 
das tust du aber im Moment nicht, und das pauschale Warten per Delay 
"repariert" (oder besser "kaschiert") das.

von Mathias O. (m-obi)


Lesenswert?

Ich hab da wohl ne falsche Denkweise. Wenn das Programm die ganze Zeit 
in der Schleife läuft und dann halt ein Zeichen am UART ankommt, kann er 
es doch verarbeiten. Oder kann er dann das Zeichen nicht empfangen, wenn 
das Programm weitergeht?

von Stefan E. (sternst)


Lesenswert?

Mathias O. schrieb:
> Wenn das Programm die ganze Zeit
> in der Schleife läuft und dann halt ein Zeichen am UART ankommt, kann er
> es doch verarbeiten.

Ja. Und wenn kein Zeichen angekommen ist, was wird dann verarbeitet?

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.