Announcement

Collapse
No announcement yet.

drawcurve mit serialport Daten zeichnen

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • drawcurve mit serialport Daten zeichnen

    Hallo,

    in meinem Projekt möchte ich eine Sinus-Funktion (beliebige Frequenz und Amplitude)
    berechnen und die einzelnen Punkte über eine Com-Schnittstelle versenden.

    Mit Hilfe einer weiteren Com-Schnittstelle werden die Daten eingelesen und
    in eine Picturebox gezeichnet (g.DrawCurve(green, sinus_pic2)).

    Das versenden der Daten funktioniert reibungslos (mit Terminalprogramm überprüft)
    aber beim zeichnen des Graphens kommt es zu Fehlern (Teile der Sinuskurve sind korrekt
    gezeichnet, andere widerrum sind nicht zu definieren)

    Würde mich über ein Lösungsansatz freuen...

    MfG okto

    [highlight=c#]
    private void berechnen()
    {
    Graphics h = pictureBox1.CreateGraphics();
    Pen red = new Pen(Color.Red, 5);
    h.Clear(pictureBox1.BackColor);


    double u = Convert.ToDouble(trackBar2.Value);
    double f = Convert.ToDouble(trackBar1.Value);

    dauer = Convert.ToInt16((1 / f) * 100000);
    takt = 0;
    takt2 = 0;

    sinus = new int[dauer];
    sinus[0] = point;


    double omega = (2 * Math.PI) * f;

    for (int zeit = 0; zeit < dauer; zeit++) //+1
    {
    double now = u * (Math.Sin(omega * zeit / 100000));
    sinus[zeit] = point - Convert.ToInt32(now);
    }


    sinus_pic[0] = new Point(0, point);

    for (int zeit = 1; zeit < pictureBox1.Width; zeit++)
    {
    double now = u * (Math.Sin(omega * zeit / 100000));
    sinus_pic[zeit] = new Point(zeit, point - Convert.ToInt32(now));

    }


    h.DrawCurve(red, sinus_pic);
    }





    private void timer1_Tick(object sender, EventArgs e)
    {
    //if (zeichen == 0)
    {
    serialPort1.Write(Convert.ToString(sinus[takt]));

    takt++;

    if (takt == dauer)
    takt = 0;
    }
    // zeichen = 1;
    }


    private void serialPort2_DataReceived(object sender, SerialDataReceivedEventArgse)
    {

    rueck = Convert.ToInt32(serialPort2.ReadExisting());


    this.Invoke(new EventHandler(DisplayText));

    }


    private void DisplayText(object sender, EventArgs e)
    {
    //zeichen = 0;
    sinus_pic2[takt2] = new Point(takt2, (rueck));

    takt2++;

    if (takt2 == 300)
    takt2 = 0;



    Graphics g = pictureBox2.CreateGraphics();
    Pen green = new Pen(Color.Green, 5);


    g.Clear(pictureBox2.BackColor);
    g.DrawCurve(green, sinus_pic2);

    }
    [/highlight]
    Zuletzt editiert von gfoidl; 25.07.2012, 10:33. Reason: C#-Tags hinzugefügt

  • #2
    Hallo,

    statt pictureBox2.CreateGraphics() zeichne besser in einem Panel und im Paint-Ereignis. Siehe [Tutorial] Zeichnen in Windows-Forms-Programmen (Paint/OnPaint, PictureBox)

    (Teile der Sinuskurve sind korrekt
    gezeichnet, andere widerrum sind nicht zu definieren)
    Ich hab mir den Code nicht durchgedacht und nicht mit dem Debugger angeschaut, aber mit dem Debugger könntest du schauen wo das Problem ist. Ggf. lass erstmal den Teil mit dem Senden/Empfangen über COM weg und zeichne einfach so einen Sinus-Verlauf. Wenn dieser passt, baust du das COM-Empfangen/Senden wieder ein.

    mfG Gü
    "Any fool can write code that a computer can understand. Good programmers write code that humans can understand". - Martin Fowler

    Comment


    • #3
      Also ich denke das liegt bestimmt nicht am Berechnen der Daten. Das sollte doch eigentlich funktionieren. Noch dazu könnte man dagegen auch Tests schreiben die verifizieren dass die richtigen Daten berechnet werden (oder auch einfach mal reindebuggen und schauen ob alles passt).
      Dann wäre die Frage was denn eigentlich verschickt wird. Evtl. kannst Du ja einen 2. PC als Empfänger aufstellen und im Hyperterminal schauen ob die Daten die Du versendest auch so ankommen.
      Danach würde ich versuchen mit dem Display zu kommunizieren und zu schauen ob dort Fehler auftreten. Was ist das eigentlich für ein Display? Hast Du den Code dazu auch geschrieben oder ist das ein fertiges Teil?

      Schließlich und endlich: Die Applikation in kleine Teile zerlegen und jeden Teil prüfen was der macht und ob die Schnittstellen richtig implementiert sind.

      Comment


      • #4
        Die Sinusfunktion wird in PictureBox1 gezeichnet, also funktioniert es mit PictureBox.
        Die Daten, die empfangen werden sind auch korrekt, da ich sie über ein Terminal Programm
        überprüft habe.

        Ich glaube, dass der Fehler bei der Umwandlung: rueck = Convert.ToInt32(serialPort2.ReadExisting());
        in der DataReceive Funktion passiert.

        Wo anders gehts doch nicht, oder?
        berechnete Daten richtig gezeichnet und gesendet!
        empfangene Daten richtig!

        Comment


        • #5
          ReadExisting liefert dir alle verfügbaren bytes als (codierten!) string. Wer weis wie viel sich den gerade im Buffer befinden? DataREceived wird irgendwann ausgelöst. Das da immer 4 Bytes liegen die einen Integer ergeben ist eher unwahrscheinlich außer du hast senden empfangen über irgendein Protokoll mit dem Sender synchronisiert. Du solltest tatsächlich den serialPort eher byteweise auslesen und dir daraus deine Integer basteln entsprechend so wie du die Daten auch gesendet hast.

          Wo anders gehts doch nicht, oder?
          Ich würde hier ohne den DataReceived Event arbeiten und einfach einen Thread basteln mit einer Schleife um SerialPort.ReadBytes. Das ist aber wohl eher eine Geschmacksfrage.

          Comment

          Working...
          X