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!