Forum: Mikrocontroller und Digitale Elektronik UART Frame Error mit Peter Fleury´s Bib. / Atmega168


von Manuel P. (Gast)


Lesenswert?

Hallo,

ich habe ein Problem bei dem ich einfach nicht weiterkomme.
Ich habe einen ATMEGA168 mit 3,64Mhz externen Quarz; Baudrate 9600;
1
#define UART_BAUD_RATE 9600 
2
#ifndef F_CPU
3
#define F_CPU 3686411 //3686411      // CPU Takt
4
#endif
5
6
void initUART()
7
{
8
  uart_init( UART_BAUD_SELECT(UART_BAUD_RATE,F_CPU) ); 
9
}

Für das Senden und Empfangen von Zeichen, nutze ich die Bib. von Peter 
Fleury.
Ein PC tauscht mit dem MC Daten in folgender Form aus:

1;1;0;1;90;1;0;94

Zum Testen, sende ich die o.g. Zeile über das Hyperterminal.
Das Hypterterminal ist ebenfalls wie o.g. konfiguriert: 9600 8-N-1

Der Controller ließt den String ein und speichert ihn dann in einer 
Struktur (das übernimmt dann die Funktion SplitString()).
1
// Deklarationen
2
volatile unsigned int c = 0;
3
volatile char bufferUart[32] = { 0 };
4
volatile unsigned int i_while = 0;
5
6
void uart_polling(void)
7
{
8
    // Hole Zeichen aus UART
9
        c = uart_getc();
10
11
        if ( c & UART_NO_DATA ) {  }
12
        else if ( c & UART_FRAME_ERROR )
13
        {
14
            uart_puts("MSG: UART Frame Error\r");
15
        }
16
        else if ( c & UART_OVERRUN_ERROR )
17
        {
18
            uart_puts("MSG: UART Overrun Error\r");
19
        }
20
        else if ( c & UART_BUFFER_OVERFLOW )
21
        {
22
            uart_puts("MSG: Buffer overflow error\r");
23
        }
24
        else
25
        {
26
      // Schreibt den Buffer voll bis EOT
27
            if ( c != 4) // 4 = EOT
28
            {
29
          bufferUart[i_while] = c;
30
        i_while++;
31
            } else // Wenn EOL erreicht
32
      {  
33
        --i_while;
34
        // EOT löschen und \0 anhängen, damit str_tok einen String erkennt  
35
        bufferUart[i_while] = '\0';  
36
37
        // Splitte String
38
        SplitString (bufferUart);  
39
40
        i_while = 0;
41
      }
42
    }
43
}

Ich hatte schon einige anderen Varianten mit # als Abschlusszeichen etc. 
aber das war auch nicht der Hit.

Wenn ich jetzt die Zeile
1;1;0;1;90;1;0;94

über das Hyperterminal schicke, bekomme ich immer Frame Errors.
Ich glaub ich seh den Wald vor lauter Bäumen nicht.

Wer weiß Rat?

Danke schonmal!

von Manuel P. (Gast)


Lesenswert?

Korrektur:

Diese Daten werden gesendet:
1;1;0;1;90;1;0;94#
1
...
2
    // Schreibt den Buffer voll bis EOT
3
     if ( c != '#')
4
     {
5
        bufferUart[i_while] = c;
6
        i_while++;
7
      } else // Wenn EOL erreicht
8
      {  
9
        --i_while;
10
        // EOT löschen und \0 anhängen, damit str_tok einen String erkennt  
11
        bufferUart[i_while] = '\0';  
12
...
So siehts aus.

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.