Serielle Schnittstelle C#

Gast #1887253
Hallo, ich hätte eine Frage zum Auslesen der Seriellen Schnittstelle mit 
C#. Es funktioniert alles wunderbar und alle Werte werden in einer 
Textbox ausgegeben. Nur habe ich ein Problem:
Meine Werte werden alle unendlichfach ausgegeben. Ich möchte allerdings, 
dass mir der Wert nur ein einziges Mal an die Textbox übergeben wird.

Mit diesem Befehl fügt er mir den Wert immer und immer wieder hinzu:

this.Invoke(new EventHandler(DisplayText));

In DisplayText steht "textBox1.AppendText(dataEmpf);" drinnen. 
Allerdings möchte ich, dass er mir alles nur einmal an die Textbox 
übergibt. Könnte mir jemand einen Tipp geben wie das funktionieren 
könnte?

Vielen Dank im Vorraus
Gast
Also hier hab ich mal den Teil des betroffenen Codes:

 private void DisplayText(object sender, EventArgs e)
        {
            textBox1.AppendText(dataEmpf);
        }

        private void serialPort1_DataReceived(object sender, 
System.IO.Ports.SerialDataReceivedEventArgs e)
        {
            dataEmpf = serialPort1.ReadExisting();
            this.Invoke(new EventHandler(DisplayText));
        }

Mit dem Code hängt er mir die Daten immer wieder hinten dran. Ich möchte 
allerdings, dass er mir die Daten nur ein einziges mal in die Textbox 
schreibt. d.h.: wenn ein neuer Wert kommt, dann soll er den alten in der 
Textbox überschreiben und dann soll (wenn die Daten zb "Hallo" wären) 
nur einmal in die Textbox "Hallo" schreiben.
Gast
Ich mache eine WinForm und will die serielle schnittstelle auslesen.
Wenn ich es mit .text schreibe hört er zwar gleich auf, aber schreibt 
mir die daten trotzdem 4mal hinaus. Ich möchte es aber nur einmal haben
Christian R. schrieb:
> setz mal einen Breakpoint und schau was da passiert!

Einen Breakpoint in Echtzeit... lol

Wenn du textbox1.Text = xyz; machst wird immer xyz drinstehen, aber nie 
4*xyz. Die einzigste möglichkeit wäre das xyz 4*die gewollten Daten 
enthält. Dann musst du sie splitten: textBox1.Text = 
xyz.Split('|')[xyz.Split('|').Lenght - 1];
Gast
Nein, das serialPort1_DataReceived Signal kommt nur ein einziges mal. 
Allerdings bin ich mal in Einzelschritten alles durchgegangen und hab 
gemerkt, dass mein Signal dataEmpf schon von vornherein um die 4mal das 
Signal liefert. Kann es sein, dass mein µC (von dem das Signal kommt) zu 
schnell für mein Programm ist?
@Suchender: Dein Problem ist "Invoke"
Wenn du Invoke verwendest, wird zwar in den MainThread synchronisiert - 
dein Thread in dem der Eventhandler aufgerufen steht aber so lange, bis 
Invoke wieder zurück ist. Invoke entspricht einem "SEND".
Was du machen musst ist ein POST oder ein BeginInvoke. Das ist die 
Asynchrone Variante. Du darfst auch auf keinen Fall eine Membervariable 
(dataEmpf) für den Transport verwenden. Weil die dann jedes Mal 
überschrieben werden "könnte" !!

Multithreading ist so eine Sache ...

Ich hab mal auf die Schnelle eine kleine TestApp gebastelt.
Eine Form mit einem serialPort1 und einer RichTextbox.
1
  public partial class Form1 : Form
2
  {
3
    public Form1()
4
    {
5
      InitializeComponent();
6

7
      // serial port öffnen
8
      this.serialPort1.Open();
9
    }
10

11
    private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
12
    {
13
      // Daten auslesen und zwischen speichern...
14
      var data = this.serialPort1.ReadExisting();
15

16
      // trace vorbereiten und ausgeben...
17
      var dt = DateTime.Now;
18
      System.Diagnostics.Debug.WriteLine(string.Format("DataReceived: {0}:{1} EventType:{3} Data:'{2}'", dt.ToLongTimeString(), dt.Millisecond, data, e.EventType));
19

20
      // POST an den MainThread um die RichText Box zu befüllen!
21
      // POST (BeginInvoke) und nicht SEND (Invoke) um den SerialPort nicht unnötig aufzuhalten!!)      
22
      this.BeginInvoke((Action)delegate() {
23
        this.richTextBox1.Text += data; });
24
    }
25

26
    private void Form1_FormClosing(object sender, FormClosingEventArgs e)
27
    {
28
      // serial port zu machen
29
      this.serialPort1.Close();
30
    }
31
  }

Hoffe das hilft dir weiter!

Grüße aus Wien
Christian
Angehängte Dateien:

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 16 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.