AVR Empfangspuffer leeren o. ser. Schnittstelle abschalten

Gast #155840
Hallo!

Ich habe folgendes Problem:

Mit einem ATMega8515 empfange ich Strings über die ser. Schnittstelle,
deren Länge ich nicht vorhersagen kann.

Die ser. Schnittstelle musste ich puffern, da die Strings teilweise
auch nur durch ein spez. Steuerzeichen getrennt gesendet werden und ich
zwischendurch den Empfangsstring leeren muss.

Bei einem bestimmten Inhalt im String soll eine bestimmte Aktion
ausgeführt werden.

Nach Beendigung soll der AVR wieder auf den Empfang eines speziellen
Strings warten.

Leider kommt es vor, das im Puffer noch Reste eines nachfolgenden
Strings sind, die nicht ausgewertet sondern verworfen werden sollen.

Wie kann ich den Puffer mit Bascom leeren?

Möglich wäre auch, dass der AVR einen Neustart macht. Wie kann ich das
realisieren?

Danke im voraus.

D. Kleinen
Wenn Du nicht weißt, wie lang die einzelnen Strings sind, dann must Du
eben jeden empfangen und zumindest dessen Ende erkennen.

Ganz schlimm wird es, wenn Du innerhalb eines Bytes die UART enablest.
Dann wird nichtmal das Startbit erkannt und die nächsten Bytes sind
völliger Murks.

Ein Neustart ist also absolut verboten, wenn Du keinen Müll empfangen
willst.


Peter
Gast
Hallo!

Da zwischen den einzelnen Strings bzw. Stringgruppen immer wieder
Pausen sind, ist das kein Problem.

Wie kann ich denn die ser. Schnittstelle ab- und wieder einschalten?

Bzw. bei einem normalen Start kann es ja auch vorkommen, dass die
SChnittstelle mittendrin eingeschaltet wird. Da wäre doch auch ein
Neustart möglich, oder?

Wie setze ich das alles in Bascom um ? (Neusrat bzw. Ein/Ausschalten)

Werde es einfach ausprobieren.

Daniel
Gast
Indem du einfach das UART-Enable Bit im UART-Kontrollregister
löscht/setzt. Scheint mir eine typische "Krankheit" von
BASCOM-Programmierern zu sein, dass so einfache Sachen zu Problemen
führen. In C setzt du dieses Bit manuell während der Init und
entsprechend stellt das Löschen auch kein Problem dar. In BASCOM müsste
man doch auch einfach auf die Systemregister zugreifen können?!
Du must in jedem Fall den Anfang eines Strings erkennen.

Und wenn das über die Pause zwischen den Strings geht, ist das auch
kein Problem:

Du zählst einfach im Timerinterrupt eine Variable hoch und der
UART-Empfangsinterrupt setzt diese Variable immer auf 0.
Erreicht nun die Variable einen bestimmten Wert, weißt Du daß eine
Pause ist und kannst dann den Empfangspuffer leeren.


Peter

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 21 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

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.