mikrocontroller.net

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


Autor: M. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: M. (Gast)
Datum:

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

M.

Autor: Stefan (Gast)
Datum:

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

Autor: M. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Okay, hat sich erledigt der Fehler liegt wo anderst!

M.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.