mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik UART sendet regelmäßig falsche Daten


Autor: Steffi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich habe folgendes UART-Testprogramm geschrieben:
#include <inttypes.h>
#include <avr/io.h>
#include <avr/interrupt.h>

#ifndef F_CPU
#define F_CPU 8000000
#endif

#define UART_BAUD_RATE 4800
#define UART_BAUD_CALC(UART_BAUD_RATE,F_OSC) 
((F_CPU)/((UART_BAUD_RATE)*16L)-1)

uint8_t i;
uint8_t temp;
uint8_t Data[10];

void uart_send (uint8_t data)
{
  while(!(UCSR0A & (1 << UDRE0)))
  ;
  UDR0 = data;
}

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

int main (void)
{
  while (1)
  {
  UCSR0B |= (1<<RXEN0) | (1<<TXEN0);
  UCSR0C |=  (1<<USBS0)| (1<<UCSZ01) | (1<<UCSZ00);
  UBRR0H=(uint8_t)(UART_BAUD_CALC(UART_BAUD_RATE,F_CPU)>>8);
  UBRR0L=(uint8_t)UART_BAUD_CALC(UART_BAUD_RATE,F_CPU);

  for (i=0; i<10; i++)
  {Data[i]= uart_receive();}

  for (i=0; i<10; i++)
  {uart_send(Data[i]);}
  }
}

Es soll die Daten, die empfangen werden, in ein Array speichern und dann 
wieder zurück schicken. Wenn ich dieses Programm mit dem Hyper-Terminal 
teste, empfange ich pro Array ein falsches Byte. Ist das Array so wie 
jetzt gerade 10 Byte groß, wird das neunte Byte falsch zurückgeschickt, 
ist es 100 Byte groß, das 99ste. Auffällig ist, dass, wenn die gleichen 
Zeichen gesendet werden, immer das gleiche falsche Zeichen auftritt.
Woran kann das liegen?
Ich hoffe, ihr könnt mir helfen, danke schonmal

Steffi

Autor: Benedikt K. (benedikt) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nachdem das letzte Byte in UDR geschrieben wurde, ist der UART noch am 
Senden, wenn du ihn neu initialisiert. Dadurch resettest du den UART und 
das letzte Byte geht kaputt.

Autor: MCP (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So etwa

#include <inttypes.h>
#include <avr/io.h>
#include <avr/interrupt.h>

#ifndef F_CPU
#define F_CPU 8000000
#endif

#define UART_BAUD_RATE 4800
#define UART_BAUD_CALC(UART_BAUD_RATE,F_OSC)
((F_CPU)/((UART_BAUD_RATE)*16L)-1)

uint8_t i;
uint8_t temp;
uint8_t Data[10];

void uart_send (uint8_t data)
{
  while(!(UCSR0A & (1 << UDRE0)))
  ;
  UDR0 = data;
}

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

int main (void)
{
  UCSR0B |= (1<<RXEN0) | (1<<TXEN0);
  UCSR0C |=  (1<<USBS0)| (1<<UCSZ01) | (1<<UCSZ00);
  UBRR0H=(uint8_t)(UART_BAUD_CALC(UART_BAUD_RATE,F_CPU)>>8);
  UBRR0L=(uint8_t)UART_BAUD_CALC(UART_BAUD_RATE,F_CPU);

  while (1)
  {

  for (i=0; i<10; i++)
  {Data[i]= uart_receive();}

  for (i=0; i<10; i++)
  {uart_send(Data[i]);}
  }
}

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.