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?
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?
Überprüfst du überhaupts die Flags? Wenn du nicht weißt was das ist -> Datenblatt!
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.
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.
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
@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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.