mikrocontroller.net

Forum: Compiler & IDEs Überprüfen ob UART etwas empfangen hat, wie ?


Autor: Andreas P. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo erstmal an alle,

ich habe folgendes Problem. Und zwar möchte ich eine eine Abfrage machen 
ob der UART etwas empfangen hat aber irgendwie scheitere ich hier. Ich 
wollte das eigentlich mit dem RXC Flag überprüfen aber das funktioniert 
nicht so wie ich will.

Für den Fall das während des Schleifendurchlaufs "endlich" eine 
Nachricht empfangen wird, sende ich eine Anfrage auf die ich eigentlich 
eine Antwort erwarte.
Ich habe zusätzlich noch eine Schleife eingebaut, die beim 9000ste 
Durchlauf eine Ausgabe auf das zukünftige Display machen soll.

Aber jetzt erstmal--> Wie mache ich die Abfrage nach einer empfangenen 
Nachricht (Nachrichten empfange ich per ISR) ?

Mein Code sieht so aus

Sende(msg);
while (!(UCSR1A & (1 << RXC1))) // Solange warten bis etwas empfangen wurde
{
  Sende(msg);
  for(int i=0; i<9000; i++)
  {
    if(i>=9000)
    {
      // Ausgabe auf Display "Keine Kommunikation"
    }
  }
}

Gruß Andi

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Andreas P. schrieb:

> [c]
>
> Sende(msg);
> while (!(UCSR1A & (1 << RXC1))) // Solange warten bis etwas empfangen
> wurde
> {
>   Sende(msg);

Wow. Dein Gegenüber wird sich schön bedanken, wenn du es mit 
Aufforderungen bombardierst.

>   for(int i=0; i<9000; i++)
>   {
>     if(i>=9000)

Wie soll denn i innerhalb der for Schleife jemals größer/gleich 9000 
werden?
die for Schleife bricht doch bei 8999 ab, ein Durchlauf mit i gleich 
9000 erfolgt doch gar nicht mehr.
Ausserdem wird diese Schleife in grob geschätzt ein Zehntel 
Millisekunden (übliche Takraten vorausgesetzt) abgearbeitet.


Fang damit an, dir erst mal Sende und Empfangsfunktionen zu schreiben. 
Und zwar ohne zu künsteln.
AVR-GCC-Tutorial , Abschnitt UART

Autor: Andreas P. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Karl,

in der Eile habe ich (als Beispiel) die for-Schleife mit rein getippt 
was aber, wie du schon gesagt hast, nicht viel Sinn macht.
Ich wollte damit nur sagen das ich paar sek. nach einer 
Kommunikationsunterbrechung auf dem Display die Ausgabe haben möchte 
"Keine Kommunikation". Da es so wie von mir oben nicht geht ist mir 
jetzt auch klar.
Sende und Empfangfkt. sind bereits vorhanden, daher jetzt die 
Überprüfung der Kommunikation.

Die Zeile:
while (!(UCSR1A & (1 << RXC1))) // Solange warten bis etwas empfangen
ist im Datenblatt vom AT90CAN128 zu finden, funktioniert aber leider 
nicht so wie gewünscht.
Daher nochmal meine Frage: Wie kann ich überprüfen ob der UART etwas 
empfangen hat ?

Gruß Andi

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn du in einer ISR die Daten liest, kannst du im Hauptprogramm nicht 
mehr an UCSR1A & (1 << RXC1) erkennen, ob etwas da ist.
Beim Auslesen eines Bytes aus dem UDR-Register (in der ISR) wird das
Bit "es ist was da" ja wieder zurückgesetzt.

Also musst du in der ISR ein Flag setzen, und das im Hauptprogramm
testen.

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.