mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik RS232 Problem mit Empfang der Daten


Autor: Fichte (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hay @all

Ich habe das Problem das ich üebr die RS232 Schnittstelle einen Daten
Stream Bekomme der so Aussieht

Anfang Stream (0xFF)
Wieviele Daten Kommen (0x08)
Dann die 8 Daten die ich Empfange.

Nun mein Problem wenn ich nun die Daten Empfange möchte ich diese in
200ms Abständen Berechnen und Ausgeben lassen auf ein LCD.

Das Berechnen und Ausgeben mache ich in einen Timer Interrupt.

Nun mein Problem:

Ich Empfange die Daten Am Anfang Korrekt bis zum ersten Timer Interrupt
den wenn dieser Einsetzt und die RS232 ist zbs. gerade dabei die 4 Daten
zu Empfangen Springt er dort raus und Berechnet -> Zeigt an, nun Springt
er wieder in meine Schleife urück wo er Aufgehört hat und macht dort
weiter aber der DAten Strean hört nicht auf zu senden also Empfange ich
in der Zeit FAlsche daten bzw. er macht mit den Falschen Daten weiter
was kann ich tun um dies zuvermeiten bzw. wie kann ich das kannse erst
Starten wenn er alle 8 Daten Empfangen hat???

Ich schreibe in Codevision.

MFG: Fichte

Autor: Max (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich würde mit zwei Buffern arbeiten:
1: Daten, die seriell empfangen werden.
2: Daten, mit denen gerechnet werden soll.
Dann musst Du nur noch den Timer-Interrupt während der sehr kurzen Zeit
stoppen, in der die Daten von Buffer1 zu Buffer2 übertragen werden.

Andere Möglichkeit: Wenn eine serielle Übertragung stattfindet, wird
währenddessen der Timer-Interrupt blockiert und erst dann wieder
freigegeben, wenn alle Daten übertragen sind.

Autor: Rahul Der trollige (rahul)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Einfacher sollte es sein, den Timer-Interrupt zu sperren, sofern die
Daten unterschiedlich lang sein können.
Wenn sichergestellt ist, dass FF nur als Start-Byte empfangen werden
kann, dann kann man in der ISR ein Flag setzen (und vielleicht auch den
Timer ausschalten). Mit dem Flag wird der Beginn eines neuen Datensatz
angezeigt. Wenn das Flag gesetzt ist, bedeutet das für die ISR, dass
als nächstes die Datenmenge ankommt. Diese wird dann in einen Zähler
geschrieben, und sobald der heruntergezählt wurde, wird der Timer
wieder aktiviert.

(Das war jetzt so aus dem Ärmel geschüttelt und aus der Hüfte
geschossen...)

Autor: Jörn G. aus H. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wie Max schon vorschlug, den Interrupt (Timer) sperren, wenn Daten
eintreffen - z.B. indem du es einfach den global sperrst mit cli()

Natürlich muß der Timer, dann im Zweifelsfall etwas warten.

Wenn das nicht erlaubt ist und du die eintreffenden Daten auch nicht
kurz stoppen kannst (z.B. mit Handshake) (du sprichts von STream), dann
bleiben nur relativ kompliziert zu programmierende STrukturen mit
immerwährendem hin-und-her-springen. Also wenn ein Zeichen im Puffer
ist, holst du es schnell per RX-Interrupt raus - sperrst aber nicht den
Interrupt (damit der Timer nicht warten muß) und sperrst in der
Timer-IRQ-Funktion wiederum auch nicht den RX-Interrupt!
Diese Daten mußt du dann in eine Fifo Struktur im RAM zwischenspeichern
und erst dann verarbeiten (Berechnung), wenn der Timer es zuläßt - du
also gerade ausreichend Zeit hast.

Ohne gründlichen Nachdenken deinerseits und am besten auch analysieren
z.B. der Zeitdauer deiner Berechnung geht das nicht. Ist nicht ganz
trivial.

jörn

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.