Forum: Mikrocontroller und Digitale Elektronik Dauer von Befehlen (für Timeout)


von Michael (Gast)


Lesenswert?

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!

von Jean P. (fubu1000)


Lesenswert?

Timer starten und auf 2sek. einstellen, wenn erreicht Funktion 
abbrechen.
Fertig.

Gruß

von Michael L. (-mic-)


Lesenswert?

und wenn du mehrere timeouts parallel brauchen solltest, stellst du den 
timer auf den kleinsten benötigten wert ein und baust dir einen 
interrupt-zähler.

gruß

michael

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

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
}

von Benedikt K. (benedikt)


Lesenswert?

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.

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.