Laden...

Ausgabe von Messwerte mit Arduino und realtime Graph - Textbox bleibt leer

Erstellt von kingf vor 7 Jahren Letzter Beitrag vor 7 Jahren 9.442 Views
K
kingf Themenstarter:in
28 Beiträge seit 2016
vor 7 Jahren
Ausgabe von Messwerte mit Arduino und realtime Graph - Textbox bleibt leer

Hallo
ich will ein Programm programmieren mit den ich die Daten aus den arduino anzeigen und als Graph anzeigen lassen. Bin Anfänger.

Ich habe ein Problem wo ist der Fehler das er die Werte nicht anzeigt im Text Box?


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace Graph
{
    public partial class Form1 : Form
    {
        
        public Form1()
        {
            InitializeComponent();
        }

        private void chart1_Click(object sender, EventArgs e)
        {

        }

        private void Form1_Load(object sender, EventArgs e)
        {

        }

        private void button1_Click(object sender, EventArgs e)
        {
            Application.Exit();   //Programm schliessen
        }

        private void Verbinden_Click(object sender, EventArgs e)
        {
            {   serialPort1.PortName = comboBox1.Text; //Verbinden mit den angebenen Port
            serialPort1.BaudRate = int.Parse(comboBox2.Text); // Verbinden mit der folgende Daten rate und konvertiere 
            if (serialPort1.IsOpen) return;
        }
            try
            {
                serialPort1.Open();
                timer1.Start();
            }

            catch
            {
                MessageBox.Show("Arduino ist angeschlossen");
            }
        }

        private void timer1_Tick(object sender, EventArgs e)
        {
            string A = serialPort1.ReadExisting();
            if (A != "")
            { richTextBox1.AppendText(A); }
        }

        private void trennen_Click(object sender, EventArgs e)
        {
            serialPort1.Close();
            timer1.Stop();
        }
        
private void richTextBox1_TextChanged(object sender, EventArgs e)
        {

        }
     
    }
}



Vielen Dank

J
251 Beiträge seit 2012
vor 7 Jahren

Guten morgen,

ist "A" mal nicht leer?

[Artikel] Debugger: Wie verwende ich den von Visual Studio?

K
kingf Themenstarter:in
28 Beiträge seit 2016
vor 7 Jahren

Guten morgen
vielen Dank
mit den Richtextbox habe ich vergessen

Das mit den A war ich unsicher.

Vielen Dank

K
kingf Themenstarter:in
28 Beiträge seit 2016
vor 7 Jahren

Und warum kann ich keine Port auswählen?

Danke

2.207 Beiträge seit 2011
vor 7 Jahren

Hallo kingf,

einfache Fragen wie "Wieso geht das nicht" sind ein bisschen schwer für uns zu beantworten. Was genau funktioniert denn nicht? Stell dir mal vor du würdest das lesen 😃 Also: Was passiert, wenn du nen Port einträgst? Kommt eine Fehlermeldung? Nimmt er den Port nicht an? Hast du mal den [Artikel] Debugger: Wie verwende ich den von Visual Studio? verwendet?

Gruss

Coffeebean

T
708 Beiträge seit 2008
vor 7 Jahren

Der Com-Port hat ein Event, welches aufgerufen wird, sobald Daten bereitstehen.
Dann kann man auf den Timer verzichten.

Zu beachten ist auch, dass der Timer oder das Event nicht im Thread der GUI laufen und daher synchronisiert werden müssen.

Ein Beispielprojekt dazu findest Du hier:
Template SerialPort
Dort sollte eigentlich alles hervorgehen.

K
kingf Themenstarter:in
28 Beiträge seit 2016
vor 7 Jahren

Vielen dank
ja habe es durch gelesen und die fehler verbessert.
jetzt
weiss ich nicht wie ich den Port ausgeben soll

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.IO.Ports;


namespace Graph
{
    public partial class Form1 : Form
    {
        
        public Form1()
        {
            InitializeComponent();
            getAvilablePort();
        }

        void getAvilablePort()
        {
            String[] Ports = SerialPort.GetPortNames();
            comboBox1.Items.AddRange(Ports);

                
                }
            private void chart1_Click(object sender, EventArgs e)
        {

        }

        private void Form1_Load(object sender, EventArgs e)
        {

        }

        private void button1_Click(object sender, EventArgs e)
        {
            Application.Exit();   //Programm schliessen
        }

        private void Verbinden_Click(object sender, EventArgs e)
        {

            try

            {
              
                if (comboBox1.Text == "" | comboBox2.Text == "")

                { }

                else
                {
                    serialPort1.PortName = comboBox1.Text;
                    serialPort1.BaudRate = Convert.ToInt32(comboBox2.Text);
                    serialPort1.Open();


                }

            }
            catch
            {
                MessageBox.Show("Arduino ist angeschlossen");
            }
        }

      

        private void trennen_Click(object sender, EventArgs e)
        {
            serialPort1.Close();
           
        }

        private void richTextBox1_TextChanged(object sender, EventArgs e)
        {

        }
    }
}

danke

oder wie verknüpfe ich es mit den Graph?

Danke

K
kingf Themenstarter:in
28 Beiträge seit 2016
vor 7 Jahren

Guten morgen

Ich hätte eine Frage
Wie verknüpfe ich richtext mit den Graph .

Danke

L
155 Beiträge seit 2012
vor 7 Jahren

Also zunächst einmal solltest du das oben genannte Event benutzen, um zu schauen ob Daten vom Port gekommen sind. Die RichTextBox besitzt die Eigenschaft .Text der du den Wert zuweisen kannst, wenn du immer nur den aktuellen Wert anzeigen willst. Sollen alle Werte(die zu den verschiedenen Zeitpunkte geliefert werden) in der Textbox angezeigt werden, solltest du dir die AppendText(string) anschauen der RichtextBox. Mit den beiden Links oben sollte es kein Problem mehr sein.

Mit freundlichen Grüßen
lutzeslife

D
985 Beiträge seit 2014
vor 7 Jahren

Wie verknüpfe ich richtext mit den Graph .

Gar nicht.

Du hast Daten, die du auf die eine (Text) oder andere Art (Graph) darstellen möchtest. Dann mach das auch so.

Der von dir angesprochene Weg wäre im RealLife vergleichbar mit:

Ich mache von dem Hammer ein Foto und häng mir das an die Wand.
Wenn ich jetzt den Hammer brauche, dann erstelle ich mir anhand des Fotos einen Hammer und benutze diesen.

😉

L
155 Beiträge seit 2012
vor 7 Jahren

Okay das hatte ich vergessen zu erwähnen. Wenn du die strings nur ausgeben willst, dann wie oben im Post beschrieben. Willst du einen Graphen darstellen musst du nach einem entsprechenden Control in WinForms suchen und schauen was es für Daten erwartet (z.B. double Werte) und diese bereitstellen oder die Werte die vom Port kommen entsprechen konvertieren.

Mit freundlichen Grüßen
lutzeslife

K
kingf Themenstarter:in
28 Beiträge seit 2016
vor 7 Jahren

Oh Vielen Vielen Dank euch.

Ja die Daten kommen ja zur der Box die werden ja angezeigt .
Aber der sh** Graph verstehe gar net wie ich den verbinden soll.

der graph muss irgendwo hier in den code rein kommen

 private void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e)
        {

            SerialPort sp = (SerialPort)sender;

            string w = sp.ReadLine();

            //string msg = sp.ReadExisting();
            if (w != String.Empty)
            {
                Invoke(new Action(() => richTextBox1.AppendText(w)));
            }
       
{
hier rein 
}

 }

danke

L
155 Beiträge seit 2012
vor 7 Jahren

Dann solltest du etwas genauer werden. Wen die Daten in der TextBox angezeigt werden ist ja schon gut. Wenn du vom "Graph" sprichst. Was genau meinst du damit? Ein Windows Forms Control irgendetwas was du zeichnen willst oder was genau? Wenn du ein Chart zeichnen willst hilft eigentlich der Beitrag

Mit freundlichen Grüßen
lutzeslife

K
kingf Themenstarter:in
28 Beiträge seit 2016
vor 7 Jahren

Ja die TextBox klappt.

Ganz genau ein Chart will ich habe das schon auf meine Windows Forms Control Oberfläche mit sline schon erstellt . nur noch verbinden will ich es damit der die Daten darauf zeigt.
sowas aber nur für die serille port
Information video

danke

L
155 Beiträge seit 2012
vor 7 Jahren

Dann ist der Beitrag des Charts den ich oben gepostet habe genau richtig, das ist das gleich Chart Control und eigentlich wird da alles beschrieben was du brauchst.. In dem Video kommen die Daten vom PerformanceCounter und bei dir eben vom SerialPort . Woher die Daten kommen ist ja Wurst. Schau dir den Beitrag an und versuche zu verstehen wie du einem Daten als Punkte ins Chart bekommst. Und wenn du eine Lösung hast oder einen Ansatz des Codes, einfach posten und wir schauen mal.

Eventuell sollte dass hier im Verstehen genügen.

Mit freundlichen Grüßen
lutzeslife

K
kingf Themenstarter:in
28 Beiträge seit 2016
vor 7 Jahren

Soviel sch... Fehler. Oh man .

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.IO;
using System.IO.Ports;
using System.Management;
using System.Threading;
using System.Diagnostics;

namespace Graphs
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private Thread spThread;
        private double[] spArray = new double[30];

        private void button1_Click(object sender, EventArgs e)
        {
            string[] ports = SerialPort.GetPortNames();
            foreach (string port in ports)
            {
                comboBox1.Items.Add(port);
            }
        }

        string t;

        private void button2_Click(object sender, EventArgs e)
        {
            t = comboBox1.Text.ToString();

            sErial(t);

        }
        SerialPort sp;
        void sErial(string Port_name)
        {
            sp = new SerialPort(Port_name, 9600, Parity.None, 8, StopBits.One);

            sp.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler);
            sp.Open();


        }

        private void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e)
        {

            SerialPort sp = (SerialPort)sender;

            string w = sp.ReadLine();

            //string msg = sp.ReadExisting();
            if (w != String.Empty)
            {
                Invoke(new Action(() => richTextBox1.AppendText(w)));
            }

            var spSerialPort = new SerialPort("Port Information", "Port Zeit");
            

            while(true)
            { spArray[spArray.Length - 1] = Math.Round(spSerialPort.NextValue(),0);
                Array.Copy(spArray, 1, spArray, 0, spArray.Length - 1);

                if (chart1.IsHandleCreated)
                {
                    this.Invoke((MethodInvoker)delegate { Updatechart1(); });
                }

                else
                        {

                }





            }



        }

        private void Updatechart1()
        {
            chart1.Series["Series1"].Points.Clear();
            for (int i = 0; i < spArray.Length - 1; ++i) ;
            {
                chart1.Series["Series1"].Points.AddY(spArray[i]);

                    }
          
        }

    



        private void button3_Click(object sender, EventArgs e)
        {
            Application.Exit();   //Programm schliessen
        }

        private void button4_Click(object sender, EventArgs e)
        {
            spThread = new Thread(new ThreadStart(this.Serialport));
            spThread.IsBackground = true;
            spThread.Start();

        }


    }






    }

D
985 Beiträge seit 2014
vor 7 Jahren

Fluchen wird dich da nicht weiterbringen. Statt der zensierten Fäkalwörter könntest du ja mal den Code anständig formatieren und beschreiben wo denn aktuell da ein Fehler auftritt.

Das erhöht die Chancen auf eine Antwort ungemein

L
155 Beiträge seit 2012
vor 7 Jahren

Versuche auch zu erklären warum du was machst. Du erstellst bei jedem DataReceived Event ein neuen Port wo du die Daten ausliest. Wieso brauchst du den du hast doch schon den Port und bekommst dort im Received Event die Daten. Wenn du da ein wenig Klärung schaffen könntest. Und wie gesagt bitte genaue Fehlerbeschreibung mitgeben sonst raten wir hier rum.

Mit freundlichen Grüßen
lutzeslife

K
kingf Themenstarter:in
28 Beiträge seit 2016
vor 7 Jahren

Vielen dank
war die letzten tage krank heute gehts .
habe das letzt alles gelöscht.

Ich versuche erst mal den Graph im Laufen zu bringen danch den Graph mit den button zu verbinden.

Vielen Dank

K
kingf Themenstarter:in
28 Beiträge seit 2016
vor 7 Jahren

Hallo

wäre es einfacher mit Zedgraph?
Ist es einfacher mit den Port zu verbinden?

Danke

T
708 Beiträge seit 2008
vor 7 Jahren

Hallo kingf,

Du kannst keinen Graph mit einem Serial Port verbinden.
Du kannst Daten in der seriellen Schnittstelle abfragen und das Ergebnis in einem Graph anzeigen. Das sind immer zwei Schritte.
Was für ein Graph das letztendlich ist, spielt prinzipiell keine Rolle.

Daher gibt es praktisch 3 Aufgaben, die Du zu erledigen hast:1.Per oben genanntem Serial Port Template die Werte aus dem Arduino beziehen 1.Den Graph mit Dummy-Daten füllen um zu verstehen wie er funktioniert (z.B. mit Hilfe von CodeProject Beispielen) 1.Ergebnis aus Aufgabe 1 mit Aufgabe 2 verknüpfen.

K
kingf Themenstarter:in
28 Beiträge seit 2016
vor 7 Jahren

Hallo

Da ist kein Fehler drin aber wo ran kann es liegen das es nicht anzeigt auf den Graph .

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.IO;
using System.IO.Ports;
using System.Management;


namespace Graphs// name der Datei
{
    public partial class Form1 : Form// unterteilung der Klassen und Methode
    {
        public Form1()// erstellung von Windows Anwendun
        {
            InitializeComponent();// ladet die Benutzeroberfläche
        }

        private void button1_Click(object sender, EventArgs e)// Funktion für Button1
        {
            string[] ports = SerialPort.GetPortNames();//Lade die aktuellen gültigen Anschluss Ports und speicher sie
            foreach (string port in ports)// Zeige jeden aktiven Portname in der Konsole 
            {
                comboBox1.Items.Add(port);//Füge die Aktiven ports in die Combobox1 ein
            }
        }

        string t;// string enthällt die t werte

        private void button2_Click(object sender, EventArgs e)// funktion für den Button1
        {
            t = comboBox1.Text.ToString();// t enthält den wert der combobox1

            sErial(t);//neue verfahren der SerialPort-Klasse unter Verwendung des angegebenen Anschlussnamens


        }
        SerialPort sp;//SerialPort mit dem namen sp
        void sErial(string Port_name)//ohne Rückgabewert, die ein String übergeben bekommt, der den Namen des Ports enthält
        {
            sp = new SerialPort(Port_name, 9600, Parity.None, 8, StopBits.One);// wird ein neuer seriall port Objekt erstellt mit den folgenden kritirein


            sp.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler); // zeig an ob neue daten kommen 
            sp.Open(); // öffne den port mit den neuen Kriterien


        }

        private void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e)// die neue daten werden ausgegeben 
        {

            SerialPort sp = (SerialPort)sender;// greift auf die serielport schnittstelle 

            string w = sp.ReadLine(); //Lese bis unendlich

            if (i == false)
            {
                rt = 0;
                i = true;
            }

            if (w != String.Empty) //falls der string wert nicht leer ist
            {
                Invoke(new Action(() => richTextBox1.AppendText(w)));// werden die daten ausgegeben in richtextbox
                chart1.Series[0].Points.AddXY(rt, Math.Sin(rt));
                

            }

          

            
        }

        private void button3_Click(object sender, EventArgs e)//Funktion für Button 3
        {
            Application.Exit();   //Programm schliessen
        }

        private void Stop_Click(object sender, EventArgs e)// Funktion für den Button Stop 
        {
            sp.Close();// schliesse den aktuellen Port

        }

        private void button4_Click(object sender, EventArgs e)
        {
            if (saveFileDialog1.ShowDialog() == DialogResult.OK)
                richTextBox1.SaveFile(saveFileDialog1.FileName);
            
        }

        private void chart1_Click(object sender, EventArgs e)
        {

        }
        double rt = 0;
        private void timer1_Tick(object sender, EventArgs e)
        {
            rt = rt + 0.1;
        }
        Boolean i = false;

    }






    }

Vielen Dank

J
251 Beiträge seit 2012
vor 7 Jahren

Wird der Port geöffnet (sErial)?
Kommen Daten an (DataReceivedHandler)?
Werden die Daten logisch richtig verwertet (DataReceivedHandler)?
([Artikel] Debugger: Wie verwende ich den von Visual Studio?)

btw: Ein bisschen strukturierter könnte der Code evtl. sein um die Lesbarkeit zu steigern, z.B. Name und Deklarierung/Initialisierung-Codestelle von i,t,sp,rt

2.207 Beiträge seit 2011
vor 7 Jahren

Hallo kingf ,

bitte beachte auch [Hinweis] Wie poste ich richtig? . Bitte keinen Code geben und sagen "Wieso geht es nicht". Wir haben weder deine Entwicklungsumgebung, schon gar nicht mit deinen Einstellungen, deine Ausgangssituation, deine komplette Ausführungsumgebung etc.

Lies dich ein und schaue mit dem Debugger [Artikel] Debugger: Wie verwende ich den von Visual Studio? was wo passiert bzw. was wo nicht passiert.

Gruss

Coffeebean

K
kingf Themenstarter:in
28 Beiträge seit 2016
vor 7 Jahren

Wird der Port geöffnet (sErial)?
Kommen Daten an (DataReceivedHandler)?
Werden die Daten logisch richtig verwertet (DataReceivedHandler)?
(
>
)

JA die Daten werden ja alle bei Richtextbox angezeigt .

nur der Graph zeigt Die Linie nicht an.

VIelen dank

L
155 Beiträge seit 2012
vor 7 Jahren

Wenn ich das richtig überblicke wird dein Graph ja nicht vom SerialPort gespeist. Du schreibst einen Wert rt jedes Mal rein. Dieser muss aber soweit ich sehe ja immer 0 sein. Da der Wert ja hier


  double rt = 0;
        private void timer1_Tick(object sender, EventArgs e)
        {
            rt = rt + 0.1;
        }

gesetzt wird und so weit ich sehe wird der Timer nie gestartet. D.h. der Wert bleibt immer 0 und damit wird der Graph auch immer auf der x-Achse liegen. So ganz macht der Code auch keinen Sinn. Der Graph stellt keine Werte da (wenn er denn was anzeigen würde) sondern nur in Abständen wenn das DataReceived Event geworfen wird, wird der rt und der sin(rt) geschrieben.

Mit freundlichen Grüßen
lutzeslife

K
kingf Themenstarter:in
28 Beiträge seit 2016
vor 7 Jahren

Wenn ich das richtig überblicke wird dein Graph ja nicht vom SerialPort gespeist. Du schreibst einen Wert rt jedes Mal rein. Dieser muss aber soweit ich sehe ja immer 0 sein. Da der Wert ja hier

  
  double rt = 0;  
        private void timer1_Tick(object sender, EventArgs e)  
        {  
            rt = rt + 0.1;  
        }  
  

gesetzt wird und so weit ich sehe wird der Timer nie gestartet. D.h. der Wert bleibt immer 0 und damit wird der Graph auch immer auf der x-Achse liegen. So ganz macht der Code auch keinen Sinn. Der Graph stellt keine Werte da (wenn er denn was anzeigen würde) sondern nur in Abständen wenn das DataReceived Event geworfen wird, wird der rt und der sin(rt) geschrieben.

Vielen dAnk
eigentlich brauche ich ja kein timer .
Weil mein sensor sendet immer nach 1 sek. den wert an den Ardurino.

Danke

J
251 Beiträge seit 2012
vor 7 Jahren

JA die Daten werden ja alle bei Richtextbox angezeigt .


Invoke(new Action(() => richTextBox1.AppendText(w)));// werden die daten ausgegeben in richtextbox
chart1.Series[0].Points.AddXY(rt, Math.Sin(rt));

Dann ist in "w" die gewünschten Daten und dem "chart1" wird dafür immer ne 0 hinzugefügt? Wenn der Timer nie ausgelöst wird und soweit die einzig weitere Stelle ist, welche "rt" verwendet.

K
kingf Themenstarter:in
28 Beiträge seit 2016
vor 7 Jahren

Also jetzt habe ich es unter den verbinden Button hingesetzt

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.IO;
using System.IO.Ports;
using System.Management;
using System.Windows.Forms.DataVisualization.Charting;


namespace Graphs// name der Datei
{
    public partial class Form1 : Form// unterteilung der Klassen und Methode
    {
        public Form1()// erstellung von Windows Anwendun
        {
            InitializeComponent();// ladet die Benutzeroberfläche
        }

        private void button1_Click(object sender, EventArgs e)// Funktion für Button1
        {
            string[] ports = SerialPort.GetPortNames();//Lade die aktuellen gültigen Anschluss Ports und speicher sie
            foreach (string port in ports)// Zeige jeden aktiven Portname in der Konsole 
            {
                comboBox1.Items.Add(port);//Füge die Aktiven ports in die Combobox1 ein
            }
        }

        string t;// string enthällt die t werte

        private void button2_Click(object sender, EventArgs e)// funktion für den Verbinden Button 
        {
            t = comboBox1.Text.ToString();// t enthält den wert der combobox1

            sErial(t);//neue verfahren der SerialPort-Klasse unter Verwendung des angegebenen Anschlussnamens

            if (i == false)
            {
                rt = 0;
                i = true;
            }

            {
                chart1.Series[0].Points.AddXY(rt, Math.Sin(w));

            }


        }
        SerialPort sp;//SerialPort mit dem namen sp
        void sErial(string Port_name)//ohne Rückgabewert, die ein String übergeben bekommt, der den Namen des Ports enthält
        {
            sp = new SerialPort(Port_name, 9600, Parity.None, 8, StopBits.One);// wird ein neuer seriall port Objekt erstellt mit den folgenden kritirein


            sp.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler); // zeig an ob neue daten kommen 
            sp.Open(); // öffne den port mit den neuen Kriterien


        }

        private void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e)// die neue daten werden ausgegeben 
        {

            SerialPort sp = (SerialPort)sender;// greift auf die serielport schnittstelle 

            string w = sp.ReadLine(); //Lese bis unendlich

          

            if (w != String.Empty) //falls der string wert nicht leer ist
            {
                Invoke(new Action(() => richTextBox1.AppendText(w)));// werden die daten ausgegeben in richtextbox
                
                

            }

          

            
        }

        private void button3_Click(object sender, EventArgs e)//Funktion für Button 3
        {
            Application.Exit();   //Programm schliessen
        }

        private void Stop_Click(object sender, EventArgs e)// Funktion für den Button Stop 
        {
            sp.Close();// schliesse den aktuellen Port

        }

        private void button4_Click(object sender, EventArgs e)
        {
            if (saveFileDialog1.ShowDialog() == DialogResult.OK)
                richTextBox1.SaveFile(saveFileDialog1.FileName);
            
        }

        private void chart1_Click(object sender, EventArgs e)
        {

        }
        double rt = 0;
        private void timer1_Tick(object sender, EventArgs e)
        {
            rt = rt + 0.1;
        }
        Boolean i = false;

    }






    }


danke

K
kingf Themenstarter:in
28 Beiträge seit 2016
vor 7 Jahren

das zeigt jetzt so an

709 Beiträge seit 2008
vor 7 Jahren

Du setzt rt immer noch nicht hoch (da der Timer nicht gestartet wird) und machst mit den Messwerten nichts außer sie zur TextBox hinzuzufügen.

Wenn du weißt, in welchem Abstand die Messwerte genommen werden, kannst du rt auch nach jedem Auftreten eines neuen Werts entsprechend hochzählen. Beachte aber, dass pro Aufruf von DataReceivedHandler auch mehr als ein Datensatz oder unvollständige Datensätze enthalten sein können.

K
kingf Themenstarter:in
28 Beiträge seit 2016
vor 7 Jahren

Sie werden in 3,5 ms gelesen

709 Beiträge seit 2008
vor 7 Jahren

Dann könntest du z.B. bei jedem empfangenen Wert deine Zeitvariable um 3,5 ms hochzählen.
Wie viele Werte du empfängst, kannst du im DataReceivedHandler herausfinden.

K
kingf Themenstarter:in
28 Beiträge seit 2016
vor 7 Jahren

achso dann ist mein rt=3,5ms

709 Beiträge seit 2008
vor 7 Jahren

Nach dem ersten Wert ja. Nach dem zweiten Wert ist er 7 usw.

Du zählst rt hoch, damit du das als X-Wert eintragen kannst.
Der Y-Wert ist der dazugehörige Messwert und denn musst du, wie bereits gesagt, noch aus dem ausgelesenen Wert holen.

K
kingf Themenstarter:in
28 Beiträge seit 2016
vor 7 Jahren

Das mit den Graphen ist ja sehr anstrgend.

K
kingf Themenstarter:in
28 Beiträge seit 2016
vor 7 Jahren

Könnten sie ein Beispiel machen?

709 Beiträge seit 2008
vor 7 Jahren

Schau dir mit dem Debugger ([Artikel] Debugger: Wie verwende ich den von Visual Studio?) an, was ankommt.

Dann musst du gucken, wie du dort am besten die Einzelwerte extrahierst.
Für jeden Einzelwert erstellst du einen Punkt und zählst deine Zeitvariable hoch.

1.040 Beiträge seit 2007
vor 7 Jahren

Das mit den Graphen ist ja sehr anstrgend.

Prinzipiell ist das nicht sehr anstrengend.
Versuche bitte strukturiert an die Sache heran zu gehen und vor allem zu verstehen, was du machst.

Der Tipp mit dem Debugger wurde dir ja nun schon zum 5. (!!!) Mal gegeben.

Der letzte Code, den du gepostet hast, kann nicht mal kompilieren, da die Variable w im button2_Click nicht bekannt ist. Selbst wenn sie es wäre, ist es unlogisch, an dieser Stelle Punkte zum Graphen hinzuzufügen. Du versuchst nämlich direkt nach dem Verbinden einen Punkt hinzuzufügen. Wozu?
Was ist mit dem Werten, die über das DataReceived-Event ankommen? Damit machst du nie etwas, außer sie zur Textbox hinzuzufügen.

Deswegen nochmal:
Versuche zu verstehen, was du da überhaupt machst.

Wenn du diese Hürde genommen hast, fällt es dir garantiert viel leichter, das Problem zu lösen.

K
kingf Themenstarter:in
28 Beiträge seit 2016
vor 7 Jahren

WArum button 2 ist für verbinden zuständig für Arduino

danke

709 Beiträge seit 2008
vor 7 Jahren

Fürs Verbinden schon, aber nicht dafür um Punkte zum Chart hinzuzufügen...
Neue Punkte sollen doch erscheinen, wenn neue Daten da sind, oder?

Hast du dein Programm schon mal mit dem Debugger aufgerufen und angesehen, was wann passiert und welche Daten ankommen?

K
kingf Themenstarter:in
28 Beiträge seit 2016
vor 7 Jahren

Vielen dank euch allen
Aber der sch... klappt net
Egal

16.830 Beiträge seit 2008
vor 7 Jahren

Glaubst Du, dass Dir irgendjemand helfen kann, wenn Du es mit "der Scheiss klappt nicht" beschreibst?

K
kingf Themenstarter:in
28 Beiträge seit 2016
vor 7 Jahren

Ich danke euch es hat alles geklappt mit zedgraph
Versuche jetzt auf der x Acshe die zeit hin zu bekommen.

Vielen dank euch

K
kingf Themenstarter:in
28 Beiträge seit 2016
vor 7 Jahren

HAllo
Wie änder ich die X Achse bei Zedgraph auf zeit?

Danke

2.207 Beiträge seit 2011
vor 7 Jahren

Hallo kingf,

ich habe keine Ahnung von Zedgraph, aber ich hab kurz gesucht und das hier gefunden. Hilft dir das?

ZedGraph - How to change X-axis from points to time?

Gruss

Coffeebean

D
985 Beiträge seit 2014
vor 7 Jahren

Nur mal so ein kleines Beispiel wie man Daten ganz gemütlich an so ein Standard-Chart bekommt.


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        private readonly List<DataPoint> dataPoints = new List<DataPoint>();
        private readonly Random rng = new Random();

        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load( object sender, EventArgs e )
        {
            chart1.Series.Clear();
            chart1.DataSource = dataPoints;
            var series = chart1.Series.Add( "DataPoints" );
            series.XValueMember = nameof( DataPoint.Timestamp );
            series.YValueMembers = nameof( DataPoint.Value );
        }

        private void button1_Click( object sender, EventArgs e )
        {
            dataPoints.Add(
                new DataPoint
                {
                    Timestamp = DateTime.Now,
                    Value = rng.NextDouble(),
                } );
            chart1.DataBind();
        }
    }
    public class DataPoint
    {
        public DateTime Timestamp { get; set; }
        public double Value { get; set; }
    }
}

Ist also alles gar nicht so schwer 😉

K
kingf Themenstarter:in
28 Beiträge seit 2016
vor 7 Jahren

Vielen dank habe es über Zedgraph gemacht über Youtube Videos.

Jetzt will ich nur wissen wie man die X-Achse auf zeit umstellt

  namespace Abstand
{
    public partial class Form1 : Form
    {
        String COMRx;
        int NoOfCurves, Samples;
        int[,] colourList = {{128,0,0},{
                0,128,0},{0,0,128},{0,128,128},{128,128,0},{255,0,0},{0,255,0},
                            {0,0,255},{255,255,0},{255,0,255},{0,255,255}};

        List<PointPairList> Data = new List<PointPairList>();

        delegate void SerialDataReceivedDelegate(object sender, SerialDataReceivedEventArgs e);

        delegate void SerialErrorReceivedDelegate(object sender, SerialErrorReceivedEventArgs e);

        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {


     
            ZedGraphControl1.GraphPane.Title.Text = "Abstandsmessung";
            ZedGraphControl1.GraphPane.XAxis.Title.Text = "Zeit";
            ZedGraphControl1.GraphPane.YAxis.Title.Text = "Abstand";
            ZedGraphControl1.GraphPane.XAxis.Scale.MinAuto = true;
            ZedGraphControl1.GraphPane.XAxis.Scale.MaxGrace = 0;

            ZedGraphControl1.GraphPane.YAxis.MajorGrid.IsVisible = true;

            ZedGraphControl1.GraphPane.XAxis.MajorGrid.IsVisible = true;

            ZedGraphControl1.GraphPane.Legend.Position = ZedGraph.LegendPos.Right;
        }

        private void COMConnectBtn_Click(object sender, EventArgs e)
        {
            COMConnectButton.Enabled = false;

            

            if (SerialPort.IsOpen)
            {
                timer1.Enabled = false;

                SerialPort.Close();

               
                COMConnectButton.Text = "Verbinden";
            }
            else
            {
                SerialPort.PortName = COMPortComboBox.Text;
                SerialPort.BaudRate = int.Parse(COMBaudComboBox.Text);

                try
                {
                    SerialPort.Open();
                }
                catch
                {
                   
                    MessageBox.Show("Kann nicht öffnen " + COMPortComboBox.Text);
                }

                if (SerialPort.IsOpen)
                {
                   
                    COMConnectButton.Text = "Trennen";

                    Data.Clear();
                    deleteCurves();
                    initCurves();

                    timer1.Enabled = true;
                }
            }

            COMConnectButton.Enabled = true;
        }

        private void initCurves()
        {
            Samples = 1000;
            NoOfCurves = 1;


            for (int j = 0; j < NoOfCurves; j++)
            {
                PointPairList tempppl = new PointPairList();

                for (double x = 0; x < Samples; x++)
                {
                    tempppl.Add(x, 0);
                }

                Data.Add(tempppl);
                ZedGraphControl1.GraphPane.AddCurve("Abstand " + j.ToString(), Data[j],
                    Color.FromArgb(colourList[j, 0], colourList[j, 1], colourList[j, 2]), SymbolType.None);
            }
        }

        private void deleteCurves()
        {
            ZedGraphControl1.GraphPane.CurveList.Clear();
        }

        private void ProcessCOMRx(object sender, EventArgs e)
        {
            if (!string.IsNullOrEmpty(COMRx))
            {
                string[] parsed = COMRx.Split(',');
                int curveNo;

                if (parsed.Count() > ZedGraphControl1.GraphPane.CurveList.Count())
                    curveNo = ZedGraphControl1.GraphPane.CurveList.Count();
                else
                    curveNo = parsed.Count();


                for (int k = 0; k < curveNo; k++)
                {
                    for (int j = ZedGraphControl1.GraphPane.CurveList[k].NPts - 1; j > 0; j--)
                    {
                        ZedGraphControl1.GraphPane.CurveList[k].Points[j].Y = ZedGraphControl1.GraphPane.CurveList[k].Points[j - 1].Y;
                    }

                    double temp = 0;

                    try
                    {
                        temp = double.Parse(parsed[k]);
                    }
                    catch
                    {
                        richTextBox1.AppendText("Parse Error\n");
                    }


                    ZedGraphControl1.GraphPane.CurveList[k].Points[0].X = 0;
                    ZedGraphControl1.GraphPane.CurveList[k].Points[0].Y = temp;
                }
   
                richTextBox1.ScrollToCaret();
                richTextBox1.AppendText(COMRx + '\n');
                COMRx = "";
            }
        }

        private void ReadLineError(object sender, EventArgs e)
        {
            richTextBox1.AppendText("Read Line Error\n");
        }

        private void SerialPort_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
        {
            int BufferLength = SerialPort.BytesToRead;
            

            while (BufferLength > 0 && SerialPort.IsOpen)
            {
                try
                {
                   
                    this.BeginInvoke(new EventHandler(ProcessCOMRx));

                    if (SerialPort.IsOpen)
                        BufferLength = SerialPort.BytesToRead;
                }
                catch
                {
                    this.BeginInvoke(new EventHandler(ReadLineError));
                }
            }
        }

        private void SampleTextBox_TextChanged(object sender, EventArgs e)
        {

        }

        private void COMPortComboBox_SelectedIndexChanged(object sender, EventArgs e)
        {

        }

        private void button2_Click(object sender, EventArgs e)
        {
            Application.Exit();   //Programm schliessen
        }

        private void button1_Click(object sender, EventArgs e)
        {
           
            
            SaveFileDialog saveFile1 = new SaveFileDialog();

            
            saveFile1.DefaultExt = "*.txt";
            saveFile1.Filter = "txt Files|*.txt";

            
            if (saveFile1.ShowDialog() == System.Windows.Forms.DialogResult.OK &&
               saveFile1.FileName.Length > 0)
            {
                
                richTextBox1.SaveFile(saveFile1.FileName, RichTextBoxStreamType.PlainText);
            }
        }

       

        private void richTextBox1_TextChanged(object sender, EventArgs e)
        {

        }

        private void timer1_Tick(object sender, EventArgs e)
        {
            ZedGraphControl1.AxisChange();
            ZedGraphControl1.Invalidate();
        }
    }
}

2.207 Beiträge seit 2011
vor 7 Jahren

Hilft dir das?


>

K
kingf Themenstarter:in
28 Beiträge seit 2016
vor 7 Jahren

Nein das hilft nicht habe ich schon gestern geschaut.

Danke