Problem bei UART-Kommunikation

Gast #5254775
Lesenswert?
• ▲
▼
Hallo Zusammen,

die UART Kommunikation funktioniert grundsätzlich. D.h. das Senden und 
Empfangen der Daten klappt. Aber mich wundert es, dass ich am Terminal 
nur die ersten 6 Bit der übertragenen Daten lesen kann/ bzw. dass diese 
den zu erwartenden Daten entsprechen. Es ist auch egal welche Daten ich 
ab den 6ten Bit sende es wird immer "11111111" empfangen. Meine Frage 
warum?
Angehängte Dateien:
#5254814
Lesenswert?
• ▲
▼
In Deiner Formel für die Baudrate stimmt die Klammerung nicht.

Deine Formel:
#define uartrate ((F_CPU+baudrate*8)/((baudrate*16)-1))

Die 1 muss nicht von (baudrate*16) abgezogen werden, sondern vom 
Gesamtergebnis.

Richtig ist:
#define uartrate ( ((F_CPU+baudrate*8) / (baudrate*16)) -1)

Durch Deine Formel schreibst Du in UBRR0 26 statt 25, was einen 
Baudratenfehler von 4% ergibt. Das sorgt für Deine Aussetzer nach 
mehreren Zeichen (nicht "Bits").

Viele Grüße, Stefan
Gast #5254835
Lesenswert?
• ▲
▼
Dein Code ist scheiße.

    /* Replace with your application code */
    while (1)
    {
    temp = USART_Empfangen();
    switch(temp)
    {
      case  'A':
      //UART_putChar(temp);
      strcpy(str,"Hallo_Lucas");
      UART_putStr(str);
      _delay_ms(1000);
      break;

      default:
      UART_putChar(temp);
      _delay_ms(1000);
      break;
    }
    }

Hier geht dein Switch Case immer ins default, wenn du nicht A eingibst.
Dann gibt er irgendwelche Mist aus, was dort im temp steht.

unsigned char USART_Empfangen(void)
{
  while(!(UCSR0A & (1<<RXC0)))
  {
  }
  return UDR0;
}

Wenn du nichts empfangen hast, was steht dann im UDR0?
Gast #5254845
Lesenswert?
• ▲
▼
> Dann gibt er irgendwelche Mist aus, was dort im temp steht.

Dann gibt er ein Echo des zuvor empfangenen Zeichen aus. Mist würde ich 
das nicht nennen.

> Wenn du nichts empfangen hast, was steht dann im UDR0?

Spielt keine Rolle, denn das Programm wartet so lange, bis etwas 
empfangen wurde.
#5254884
Lesenswert?
• ▲
▼
Lucas Pelchen schrieb:
> Habe die Baudratenberechnung richtig gestellt, jedoch immer noch das
> selbe Bild.

Dir ist schon klar das der UART keinen Fifo hat und durch die ganzen 
delays jede Menge Zeichen verloren gehen?

Übrigens benutzen die meisten modernen Terminals einen Zeilenpuffer. 
Weil die Zeile am Stück gesendet wird muss man auch jede Millisekunde 
(bei 9600 Baud) ein Zeichen abholen können - der OP Code kann es aber 
nur 1x pro Sekunde...

Schau Dir mal an wie man eine Zustandsmaschine oder einen endlichen 
Automaten programmiert.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 8 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.