Forum: Mikrocontroller und Digitale Elektronik AVR Empfangspuffer leeren o. ser. Schnittstelle abschalten


von Daniel Kleinen (Gast)


Lesenswert?

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

von Peter D. (peda)


Lesenswert?

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

von Daniel Kleinen (Gast)


Lesenswert?

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

von Mike (Gast)


Lesenswert?

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?!

von Peter D. (peda)


Lesenswert?

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

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.