Dauer von Befehlen (für Timeout)

Gast #1148106
Hi,

ich habe eine Funktion, die abfragt ob Daten über UART zu mir gesendet 
wurden. Diese Funktion sieht so aus:
1
uint8_t USART_get(void)
2
{
3
  //Warte bis Daten erhalten
4
  while ( !(UCSRA & ( 1<<RXC)) );
5

6
  //Hole Daten vom Puffer und gib sie zurück
7
  return UDR;
8
}

So da ich jetzt aber in einer Endlosschleife lande, wenn ich diese 
Funktion aufrufe, möchte ich ein Timeout einbauen:
1
uint8_t USART_get(void)
2
{
3
  uint8_t i = 0;
4

5
  //Warte bis Daten erhalten
6
  while ( !(UCSRA & ( 1<<RXC)) )
7
  {
8
    if(i == 255)
9
    return 255;    // Error Code
10
    i++;
11
  }
12

13
  //Hole Daten vom Puffer und gib sie zurück
14
  return UDR;
15
}

Also im Prinzip, dass ich in der While Schleife eine Zahl immer 
inkrementiere und abfrage ob sie einen gewissen Wert erreicht hat. Und 
ich habe aber keine Ahnung wie ich mir ausrechnen kann, welchen Wert ich 
für z.b. 2 Sekunden brauche. (Das Beispiel hier ist nur zu 
veranschaulichung, ich weiß das ich nicht 255 zurückgeben kann als Error 
Code, weil es ja bei UDR auch auftretten kann und ich weiß auch, dass 
ich wahrscheinlich i als 16 bit Variable deklarieren muss)

Kann mir jemand erklären, wie ich das Ausrechnen kann? Falls jemand eine 
bessere Lösungsidee hätte, nur her damit!
Moderator (Firma: Titel) Persönliche Seite #1148848
Wozu warten?
Sieh im Statusregister nach, ob was da ist und wenn nicht,
dann spring mit dem Fehlercode sofort zurück.
1
uint8_t USART_get(uint8_t* p)
2
{
3
  // sind Daten da?
4
  if ( !(UCSRA & ( 1<<RXC)) )  
5
     *p = UDR;   // ja: Gib die Daten über zeiger zurück
6
     return 1;   //     Empfang ok
7
  else
8
     return 0;   // nein: Error Code
9
}
#1148850
Lothar Miller wrote:
> Wozu warten?
> Sieh im Statusregister nach, ob was da ist und wenn nicht,
> dann spring mit dem Fehlercode sofort zurück.

Das ist aber keine Lösung des Problems, sondern nur die Verlagerung des 
Problems an eine andere Stelle.

Antwort schreiben

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