www.mikrocontroller.net

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


Autor: Manuel P. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich habe ein Problem bei dem ich einfach nicht weiterkomme.
Ich habe einen ATMEGA168 mit 3,64Mhz externen Quarz; Baudrate 9600;
#define UART_BAUD_RATE 9600 
#ifndef F_CPU
#define F_CPU 3686411 //3686411      // CPU Takt
#endif

void initUART()
{
  uart_init( UART_BAUD_SELECT(UART_BAUD_RATE,F_CPU) ); 
}

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()).
// Deklarationen
volatile unsigned int c = 0;
volatile char bufferUart[32] = { 0 };
volatile unsigned int i_while = 0;

void uart_polling(void)
{
    // Hole Zeichen aus UART
        c = uart_getc();

        if ( c & UART_NO_DATA ) {  }
        else if ( c & UART_FRAME_ERROR )
        {
            uart_puts("MSG: UART Frame Error\r");
        }
        else if ( c & UART_OVERRUN_ERROR )
        {
            uart_puts("MSG: UART Overrun Error\r");
        }
        else if ( c & UART_BUFFER_OVERFLOW )
        {
            uart_puts("MSG: Buffer overflow error\r");
        }
        else
        {
      // Schreibt den Buffer voll bis EOT
            if ( c != 4) // 4 = EOT
            {
          bufferUart[i_while] = c;
        i_while++;
            } else // Wenn EOL erreicht
      {  
        --i_while;
        // EOT löschen und \0 anhängen, damit str_tok einen String erkennt  
        bufferUart[i_while] = '\0';  

        // Splitte String
        SplitString (bufferUart);  

        i_while = 0;
      }
    }
}

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!

Autor: Manuel P. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Korrektur:

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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.