UART Empfang ohne tatsaechliche Daten!

Gast #658700
Hallo,

ich arbeite mich gerade in die serielle Kommunikation mit AVR ein.
Setup: AVR4433, MAX232, Anbindung an PC. Auf dem uC laeuft ein kleines 
Programm aus dem AVR-GCC Tutorial. Dieses macht nicht anderes als das 
Empfangsbit im UART Statusregister zu pollen und beim Ankommen eines 
Zeichens dieses auszulesen und an den PC zurueckzuschicken.
Leider gibt es da ein kleines Problem: Auch wenn nichts vom PC gesendet 
wird glaubt der AVR etwas empfangen zu haben. Selbst wenn ich die TX 
Leitung vom PC abziehe scheint der AVR immer noch etwas zu empfangen.
Gibt es da kleingedrucktes was ich uebersehen haben ?

-Hugo
Gast
Es ist ein GCC Problem. Kann es mir aber nicht erklaeren. Der Code sieht 
folgendermassen aus:
1
/* Serielle Kommunikation */
2
/* 4800 Baud, 8 Databits, 1 Stopbit, keine Paritaet */
3

4
#include <stdint.h>
5
#include <stdlib.h>
6
#include <avr/io.h>
7

8
char test;
9

10
void uart_sendchar(unsigned char c)
11
{ 
12
 while (!(UCSRA & (1<<UDRE))) /* Warten bis sendebereit */
13
 {
14
 }
15
 UDR = c; /* Zeichen senden */
16
}
17

18
void uart_sendstring (char *s)
19
{
20
 while (*s)
21
 {
22
  uart_sendchar(*s);
23
  s++;
24
 }
25
}
26

27
char uart_receivechar(void)
28
{
29
 while (!(UCSRA & (1<<RXC)))  /* Warten bis Zeichen verfuegbar */
30
  {
31
  }
32
 return UDR;
33
}
34

35
int main(void)
36
{
37
 UCSRB |= (1<<TXEN); /* Transmitter enable */
38
 UCSRB |= (1<<RXEN); /* Receiver enable */
39
 UBRR = 51; /* Baudrate bei 4MHz und 4800baud */
40

41
 uart_sendstring("Hallo PC !");
42

43
 while(1)
44
 {
45

46
  test=uart_receivechar; 
47

48
  while (!(UCSRA & (1<<RXC)))  /* !(UCSRA & (1<<RXC))  Warten bis Zeichen verfuegbar */
49
   {
50
   }
51
  test = UDR;
52
  uart_sendstring("Empfange:");
53
  uart_sendchar(test);
54
  uart_sendstring("\n\r");
55
 }
56

57

58
return 0;
59
}

Das Problem verursacht die Routine uart_receivechar(void). Wie es 
aussieht wird sie niemals aufgerufen, deshalb kommt auch die Ausgabe 
"Empfange" ohne dass wirklich etwas da ist. Bringe ich den Inhalt der 
Routine in die Hauptschleife, dann wird wirklich gewartet bis ein 
Zeichen eingetroffen ist und dieses dann auch ausgegeben.
Kann mir jemand den Grund sagen wieso die Routine nicht 
aufgerufen/ausgefuehrt wird ?

-Hugo
Gast
> >> test=uart_receivechar; <<
> deine Funktion aufrufen? Versuch's mal mit Klammern für die Funktion.

Das koennte eine Ursache sein. Bin zu verdorben mit Pascal...

Danke!

-Hugo
Simon Küppers wrote:
> Das sollte aber eigentlich einen Kompilier-Fehler geben.

Nö, ist ja kein Fehler. Gibt nur ne Warnung.

Aber viele Leute denken ja, Warnungen sind nur dazu da, daß man sie nie 
durchliest.


Peter

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 19 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.