Wenn dein Problem oder deine Frage geklärt worden ist, markiere den Beitrag als "Lösung",
indem du auf den "Lösung" Button rechts unter dem entsprechenden Beitrag klickst. Vielen Dank!
bin neu hier und arbeite mich gerade in die Studentenversion von LabView2011 ein.
Zu LabView bin ich gekommen, da ich einen Weg suchte, um einfach (und mit einer grafischen Oberfläche) über die RS-232 Schnittstelle mit meinem Mikrocontroller zu kommunizieren.
Ich habe jetzt in meinem Programm die Möglichkeit verschiedene Sachen für die COM Schnittstelle einzustellen. Mit verschiedenen Buttons können dann diverse Befehle an den µC gesendet werden.
Über den Button "ADC auslesen" werden Daten an den µC gesendet, Daten vom µC empfangen, ausgewertet und angezeigt.
Dies wiederholt sich 20 mal.
Soweit funktioniert alles....
Jetzt hab ich aber noch ein paar Sachen die ich ändern will, aber weiß nicht wie ich das am besten anstelle.
1. Programmierstiel: Es kommt mir so vor als wäre meine Lösung mit den ganzen Case Strukturen viel zu übetrieben. Ich weiß aber nicht wie ich sonst auf einen Button-klick reagieren soll. Es gibt ja diese Event Struktur, aber diese wartet ja bis ein Event eintritt und solange passiert garnix -> also nützt auch nix.
2. Gegenseitiges sperren der Buttons: Wenn z.B.: der Button "ADC auslesen" gedrückt wird ist das Programm erst mal 20 sek. beschäftigt. Wird in dieser Zeit ein anderer Button gedrückt passiert zwar erst einmal nichts, aber sobalt das Programm wieder "Luft hat" wird die Aktion die sich hinter dem Button befindet ausgeführt. Das Programm merkt sich also, das ein Button gedrückt wurde.
Ich hätte es jetzt gerne so, das der Button-klick eben garnicht erst realisiert wird, wenn das Programm in irgendeiner Schleife festhängt. Gedacht hatte ich mir das über eine Art Variable die ich auf "1" setze sobald eine Case Struktur aktiv ist und wieder auf "0" setze, wenn diese abgearbeitet ist. Auf einen Button-klick wird nur reagiert, wenn diese Variable den Wert "0" hat.
Allerdings kann man in LabView mit lokalen Variablen nur im Bezug auf Anzeige und Bedienelemente verwenden soweit ich weiß - also nicht wirklich eine Variable (??)
Wie kann man dies sinnvoll lösen ?
3. Durch den Button "ADC auslesen" wird ja zyklisch (20 mal) ein Befehl an den µC gesendet und auf dessen Antwort gewartet. Ich hätte es jetzt gerne so, das ich diesen Prozess jederzeit abbrechen kann, aber mit dem selben Button ! Heißt also, sobald die Case Struktur für "ADC auslesen" aktiv ist, müsst sich die Beschriftung des Buttons ändern und auch dessen Funktion - da er ja dann die While Schleife in der Case Struktur unterbrechen soll.
Man könnte z.B.: den ADC auslesen Button unsichtbar machen wenn dieser geklickt wurde und dafür einen anderen Sichtbar machen. Nur ich weiß nicht wie ....
Hab das Programm mal als Anhang mitgeschickt, weiß noch nicht wie man das hier im Forum am besten macht. Auf Screenshots hat man sicher keinen Überblick und den Code reinschreiben wie bei c oder so geht ja auch nich....
So das waren ja jetzt ne Menge (dumme) Fragen, vielen Dank schon mal für die Hilfe.
04.04.2013, 14:43 (Dieser Beitrag wurde zuletzt bearbeitet: 04.04.2013 14:46 von GerdW.)
1) Eine Event-Struktur kennt aber auch einen TimeOut, über den du die Abarbeitung anderer Dinge steuern kannst...
Zum "Stiel": Paralleles Verteilen einer Resource (hier: COM-Port) ist ungünstig. Jeder Button = 1 Eventcase. Auch günstig: Producer-Consumer-Schema mit Queue...
2) Dein Problem ist, dass das UI sehr viel schneller bedient werden kann als dein Programm darauf reagiert (bzw. die Befehle abarbeitet).
Mögliche Lösung: Buttons deaktivieren. Finde ich hässlich, wenn das UI dauernd rumflackert.
Mögliche Lösung: Producer-Consumer-Struktur und die Befehle per Notifier verteilt. Der Consumer erhält damit immer nur den letzten Befehl (=Tastendruck).
Es gibt sicher noch andere Lösungen, aber alle fange mit einer guten Programmstruktur an...
3) Man kann das Schaltverhalten des Buttons ändern, von Latch nach Switch. Jedem Button-State kann man einen anderen Text verpassen. In der Schleife dann testen, ob der Button noch gedrückt ist, nach der Schleife zurücksetzen (per lokaler Variable). geht, lässt sich aber auch per Producer-Consumer (und mit einer Statemachine) anders lösen...