Forum: Compiler & IDEs UART Empfangspuffer ignorieren


von Uwe (Gast)


Lesenswert?

Hallo,

ich habe einen Atmega 128 und die UART per Pollen eingestellt. Nun 
möchte ich, dass mein Programm läuft, egal ob der Sensor über die UART 
angeschlossen ist oder nicht.

Ich sende Befehle über die UART aus, lese aber die Antwort nicht zurück.

Wenn der Sensor nicht angeschlossen ist, funktioniert das!
Sobald ich den Sensor anschließe, hängt sich mein Programm auf. Liegt 
das daran, dass ich den Empfangspuffer nicht leere, sondern eben einfach 
nur ignoriere??

Ich verwende bei der UART die Befehle getchar() und putchar und möchte 
diese aber nicht per Interrupt steuern.
Wie kann ich dann das Programm schreiben, dass ich in der Funktion 
getchar() nicht hängen bleibe, weil kein Zeichen kommt?

von Uwe .. (uwegw)


Lesenswert?

Irgendwie erscheint mir deine Beschreibung etwas widerspüchlich:
Du sendest nur, liest aber nichts ein, und trotzdem hast du ein 
getchar() im programm? Also liest du doch was ein? Und wie kommst du 
eigentlich an die Daten des Sensors, wenn du doch die Antworten 
ignorieren willst?

von ahlol (Gast)


Lesenswert?

Überprüfst du überhaupts die Flags? Wenn du nicht weißt was das ist -> 
Datenblatt!

von Thomas W. (thomas100)


Lesenswert?

getchar () liest, wie der Name schon sagt, ein Zeichen. Und wenn keins 
da ist, wartet die Funktion so lange, bis eins da ist.
Also vorher abfragen, ob in deinem Empfangsbuffer Zeichen liegen. Dann 
erst mit getchar() abfragen.

von Uwe (Gast)


Lesenswert?

Aber einen Empfangspuffer habe ich nur, wenn ich die UART per Interrupt 
steuere. Ich möchte sie aber pollen. Wie geht das dann?

Kann ich die UART per pollen nutzen und was soll ich vorher abfragen, 
bevor ich die Funktion getchar dann aufrufe?

Rx_counter geht dann nicht, soweit ich das sehen kann.

von Detlev T. (detlevt)


Lesenswert?

Hallo Uwe,

es hängt ja davon ab, was die Funktion getchar() macht. Wartet sie 
solange, bis tatsächlich ein Zeichen kommt? Wenn ja, dann musst du diese 
Routine ändern, da führt kein Weg dran vorbei. Dann brauchst du eine 
Unterscheidung, ob ein Zeichen empfangen wurde oder nicht.

Übliche Alternativen sind
1.) 0x00 zurückzugeben, wenn kein Zeichen empfangen wurde. Das setzt 
natürlich voraus, dass dieser Wert im Zeichenstrom nicht vorkommen kann. 
(z.B. ASCII)
2.) Der Rückgabewert ist nicht vom Typ char, sondern uint16_t. Das 
erlaubt auch den Wert 0x00 im Zeichenstrom, weil man dann bei keinem 
Zeichen z.B. 0x8000 zurückgeben kann.

Gruß, DetlevT

von ahlol (Gast)


Lesenswert?

@Uwe: Nochmals... Schau mals Datenblatt an, da steht das bestimmt mit 
den Flags passend drin ;-)

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.