RS232: warten auf Zeichen

Andy878

Neues Mitglied
05. März 2010
2
0
0
Sprachen
Hallo,

hab da ein kleines Problem:

Ich versuche gerade einen Gerät per Mikrocontroller über eine serielle Übertragung anzusteuern.
Eigentlich funktioniert alles, bin nur gerade dabei Bugs zu entfernen...

Also ich schick ein Kommando and das Gerät, und bei erfolgreicher Kommunikation schickt es mir ein Kommando zurück...soweit, sogut. Jetzt hab ich aber das Problem, das er mir bei getch() ja solange warten würde, bis er ein Zeichen bekommt. Kommt aber kein Zeichen, würde sich mein Programm aufhängen.

Wie könnte ich das jetzt Programm-technisch realisieren, dass er mir nach einer bestimmten Zeit automatisch aus dieser Anweisung raus hüpft?
Könnte ich das mit der Funktion kbhit() machen?

Sry für die dumme Frage, beschäftige mich aber erst seit ein paar Wochen mit Microkontrollern und AVR-Studio.

Schon mal Danke im Voraus
 
Der UART verfügt, soweit mich nicht alles täuscht, über einen Interrupt der ausgelöst wird wenn etwas im Empfangspuffer ist. Damit könntest du dann immer nur dann reagieren wenn auch was im Puffer ist. Oder du pollst den Puffer, fragst also immer wieder nach ob was drin ist.
Willst du deine Lösung beibehalten müsstest du einen Timeout einbauen. Also mit einem Timer einen Counter runterzählen, ist der auf 0 ist der Timeout abgelaufen, der Counter wird zurückgesetzt und das Programm läuft weiter.
 
Hi Andy,

welche MCU verwendest Du?

Die USARTs haben einen RXC-Interrupt (Receive Complete), der dann fliegt, wenn ein Zeichen fertig empfangen wird. Okay, vorausgesetzt der Interrupt ist an und die globalen Interrupts sind ebenfalls an. Der Interrupt funktioniert unabhängig von main(). Sprich, wenn ein Interrupt feuert, springt die MCU in die Interrupt-Routine, arbeitet sie ab und kehrt zurück zu main().

Ein anderer Ansatz wäre den Empfangspuffer zu pollen. Was jetzt besser ist, hängt von Deinem Anwendungsfall ab.

Grüsse
Heinrich
 
Zuerst mal danke für die schnelle Hilfe.
Werds jetzt dann mal mit nem Timeout probieren
Falls ich es nicht schaffen sollte, werd ich mich nochmal melden:) .

Ich verwende den ATMega32...

Schöne Grüsse
Andy
 
Hallo Andy,

ich verstehe nur nicht, warum Du unbedingt auf ein Zeichen warten willst und nicht über Interrupt oder Polling gehen willst/kannst?

Grüsse
Heinrich
 
Hallo,

bin vor einiger Zeit über den Befehl "Ischarwaiting" gestolpert...
Der macht genau dass, was man mit Interrupt auch machen
könnte: Er gibt eine "1! zurück, wenn ein Zeichen im Puffer
ist und eine "0" halt, wenn nix da ist.


Gruß,
Duesentrieb72
 
Über Interrupts zu gehen wäre dennoch am geschicktesten (und elegantesten)
 
Hallo Andy878,

hier mal ein Ausschnitt, wie ich da gelöst habe:

.....
On Urxc Onrxd 'RS232-Interrupt-Routine setzen
Enable Urxc 'Interrupt URXC einschalten

....
Onrxd:
J = Udr 'Byte aus der UART auslesen
If J = 13 Then ' wenn enter gesendet wurde
Gosub Comempfangauswerten ' dann den Strung auswerten
Goto Fertig
End If
Strempfang = Strempfang + Chr(j)
Fertig:
Return
.......
Comempfangauswerten:
Strempfang = Ltrim(strempfang) 'führende Leerzeichen entfernen
Strlaenge = Len(strempfang)
If Strlaenge < 4 Then 'wenn es z.B. mind 4 zeichen sein müssen
Goto das_war_mist
End If
Auswertung = Left(strempfang , 4) 'z.Bsp. ein Code für eine Tätigkeit
If Strlaenge > 5 Then
Strlaenge = Strlaenge - 5
Realwert = Right(strempfang , Strlaenge) 'z.Bsp. ein wert um den geändert werden soll
End If
Strempfang = ""

Select Case Auswertung

Case addieren ' z.B. Auswertung=1000
Var =Var + Realwert

Case subtrahieren ' z.B. Auswertung=2000
Var =Var - Realwert

End Select
das_war_mist:
Strlaenge = 0
Auswertung = ""
Realwert = ""
Return

Damit kannst Du über ein Terminal dem uC mit "1000 25" sagen, er soll
die Var um 25 erhöhen.
Auf diese Art übergebe ich meiner Heizungsteuerung neue Eckwerte, die er dann in eine I2C-EEProm schreibt und von dort aus benutzt.
Geht vielleicht auch eleganter, aber klappt bei mir fehlerfrei.
Man kann auch noch CRC einbauen, wenn es um kritische Daten geht.

Gruß
Erzgebirgler47
 

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)