@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