Uart Empfang von Strings mit Buffer - Interrupt, volatile

Gast #506008
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.

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

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.