Forum: Mikrocontroller und Digitale Elektronik mega64, RS232-Receiv-Interrupt und Polling


von Tobias (Gast)


Lesenswert?

Hallo zusammen,

über die RS232-Schnittstelle möchte ich in unregelmäßigen Abständen
wenige(4-7) Bytes empfangen.

Der Receiver-Interrupt(1.Byte) soll der Start für die Empfangsroutine
sein. Alle weiteren Bytes sollen im Pollingverfahren empfangen werden.

Wie sieht die Pollingroutine(Codevision) aus?

Reicht dieses für das 2. 3. und 4.-Zeichen:?

   while(!(UCSR0A & 1<<7)) {}
   data = UDR0; // 2.Zeichen holen
   while(!(UCSR0A & 1<<7)) {}
   data = UDR0; // 3.Zeichen holen
   while(!(UCSR0A & 1<<7)) {}
   data = UDR0; // 4.Zeichen holen

Also, prinzipiell funktioniert das, aber manchmal hängt sich das
Programm in der while-Funktion zum 3.Zeichen auf.

Gibt es da eine Lösung? Vielen Dank für eure Mühe!

Tobis

von Stefan (Gast)


Lesenswert?

Der Code schaut für mich auf den ersten Blick eigentlich richtig aus.
Vielleicht gibt es ein Problem in Verbindung mit der Interrupt-Logik
des   UART. Probier doch mal in der ISR nach dem Lesen des ersten
UDR-Inhalts den RXC-Interrupt des UART abzuschalten und am Ende der ISR
wieder zu aktivieren.
Alternativ ohne Polling und einem globalen Puffer arbeiten.

Stefan

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.