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


von Andreas P. (Gast)


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
1
Sende(msg);
2
while (!(UCSR1A & (1 << RXC1))) // Solange warten bis etwas empfangen wurde
3
{
4
  Sende(msg);
5
  for(int i=0; i<9000; i++)
6
  {
7
    if(i>=9000)
8
    {
9
      // Ausgabe auf Display "Keine Kommunikation"
10
    }
11
  }
12
}

Gruß Andi

von Karl H. (kbuchegg)


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

von Andreas P. (Gast)


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:
1
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

von Klaus W. (mfgkw)


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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.