Forum: Compiler & IDEs Uart Empfang von Strings mit Buffer - Interrupt, volatile


von M. (Gast)


Lesenswert?

Hallo,

ich empfange über eine Interruptroutine Datensätze und speichere sie in 
einem globalen Vektor aus Strings ab:
char UART_buffer[UART_bufferfields][UART_buffersize];

Eine Variable namens new_messages verwende ich dazu um in einem Zähler 
die Anzahl der neuen noch nicht ausgewerteten Strings 
UART_buffer[UART_bufferfields] zu speichern. Inkrementiert wird in der 
Interruptroutine wenn ein neuer Datensatz/String UART_buffer[n] komplett 
ist.
new_messages habe ich global als
uint8_t volatile new_messages = 0;
initialisiert.

In main überprüfe ich nun mittels

while(1){
..
  if(new_messages > 0){
    ... //Daten auswerten
    new_messages--;
  }
..
}

ob neue Daten zum auswerten da sind, falls ja werte ich aus und 
verringere den Zähler new_message um eins.

Zweck der ganzen Sache soll sein zu verhindern, dass beim auswerten 
nicht nicht vollständige Datensätze gelesen werden und dass die 
Auswertung von UART_buffer[k] die einlesende Interruptroutine im Buffer 
nicht "überholt".

Leider funktioniert die ganze Sache nicht. Die Auswertung stockt obwohl 
eigentlich Datensätze da sein sollten. Kommentiere ich in main die if 
Abfrage auf neue messages aus läuft zwar die Auswertung, aber es kommt 
zu dem unerwünschten Effekt, dass Daten verloren gehen wenn die 
Auswertung schneller ist als neue Datensätze nachfolgen ("überholen" der 
Vektorindixe). In diesem Fall sehe ich auch wie der Zähler new_messages 
inkrementiert wird wenn ich ihn auf meinem Display ausgebe.

Was mache ich falsch oder wie geht es anderst? Verwende ich volatile 
falsch? Habe leider keinen JTAG programmer zum debuggen.

Danke
M.

von M. (Gast)


Lesenswert?

Keine Vorschläge? Frage unklar? Komme momentan nicht weiter!

M.

von Stefan (Gast)


Lesenswert?

Violation of Rule #1 (Give Complete Source Code) detected!
Thread will be eliminated in 24 hours!

von M. (Gast)


Lesenswert?

Okay, hat sich erledigt der Fehler liegt wo anderst!

M.

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.