wie Messung stoppen?

Hallo Liebe Forummitglieder,
Ich bin ein Arduino Neuling und habe ein Problem. Ich komme einfach nicht weiter, Ich hoffe, ihr könnt mir helfen. ich möchte mit dem Arduino Leonardo und einem Temperatursensor PT1000 folgendes realisieren: Wenn man auf Start klickt, soll die Temperatur, bis sie einen sollwert erreicht, gemessen und graphisch in einem Diagramm dargestellt werden. Das Interface etc..habe ich über visual studio realisiert. Es funktioniert alles soweit . Bis auf den stopp Button. Wenn ich auf start klicke wird richtig gemessen und alles läuft perfekt, ABER alle anderen buttons werden blockiert, da ich den start button als while schleife realisiert habe (nochmal:bin neuling). Ich weiß nicht, wie ich aus dieser while schleife wieder rauskomme, oder wie ich sie alternativ darstellen kann. Ich habe hier mal den Teil zu meinem Start Button gepostet. Vielen Dank schonmal (auch nur fürs durchlesen) :slight_smile:

private void Start_Click(object sender, EventArgs e)
{
serialPort1.PortName = "COM7";
serialPort1.StopBits = StopBits.One;
serialPort1.RtsEnable = true;
serialPort1.StopBits = StopBits.One;
serialPort1.Handshake = Handshake.None;
serialPort1.DataReceived += serialPort1_DataReceived; //+= denildikten sonra 2 kere tab yap

try
{
serialPort1.Open();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Error!");
}

while (Start.Enabled == true)
{
isTemp.Text = data_rx;
isTemp.Update();

if (i == false)
{
rt = 0;
i = true;
}
data_rx = serialPort1.ReadLine();
this.chart1.Series["Data1"].Points.AddXY(rt, data_rx); // rt zeit; data
this.Invoke(new EventHandler(displaydata_event));

}
Start.Enabled = false;
Stop.Enabled = true;
}

du solltest in die While Schleife eine if Abfrage einfügen if (isTemp > Wert ) Start.Enabled = false;

In einem Event basierenden System haben blockierende while-Schleifen nichts verloren!

Du hast doch schon den SerialReceived Event Handler. Wieso also noch blockieren?
Der ist genau dafür da. Der wird ausgelöst wenn Daten ankommen. Während dessen läuft der Rest weiter. Also packe dein Serial.ReadLine() in den EventHandler wo es hingehört!

Nach dem Auslesen musst du dann BeginInvoke (am besten über MethodInvoker) verwenden um von da auf das UI Thread zuzugreifen. Sowas:

chart1.BeginInvoke((MethodInvoker)delegate
{
   chart1.Series["Data1"].Points.AddXY(rt, data_rx); 
});

Ich habe allerdings festgestellt, dass der Event Handler nicht immer zuverlässig triggert. Deshalb verwende ich meistens einen Timer um zu Pollen ob Daten da sind. Danach ist das Prinzip aber identisch

Sowohl den EventHandler als auch den Timer kann man einfach deaktivieren wenn man die Messung stoppt. Für EventHandler:

Vielen Dank schonmal (auch nur fürs durchlesen)

Bitte, ich hab's durchgelesen. :wink:

Du solltest in der Schleife den Stop Button abfragen.

Grüße Uwe

uwefed:
Du solltest in der Schleife den Stop Button abfragen.

Das ist C#/.NET Code! Das ist ein Event basierendes System.

Da hat man keine Schleifen die irgendwas abfragen. Sondern vom System werden Ereignisse ausgelöst und man kann sich in diese Ereignisse mit einem Event Handler einklinken (im Software Design als Observer Pattern bekannt). Also hat man einen Button EventHandler und wenn der Button gedrückt wird wird der automatisch die Event Handler Methode aufgerufen.

Genauso bei Serial. Wenn Daten ankommen wird ein Event ausgelöst und man liest ein. Das mit dem Timer das ich oben erwähnt habe geht genauso. Der Timer löst einen Event aus wenn die Zeit abgelaufen ist und man kann dann nachfragen ob Daten da sind.

Dann muss man nur aufpassen dass man von anderen Threads nicht auf das UI Thread zugreifen kann. Deshalb der Thread-übergreifende Zugriff mit BeginInvoke() bzw. Invoke()

Wenn man aufhören will von Serial einzulesen kann man seinen Event Handler abmelden. Oder auch noch die serielle Verbindung schließen wenn man sonst nichts mehr macht.