Empfangsdaten von Serial über Message Box ausgeben

Hallo zusammen!

An meinen Computer habe ich ein RFID Lesegerät per SerialPort angeschlossen. Wenn sich nun ein Transponder nähert, sendet das Lesegerät dessen ID. Nun soll mein Programm darauf achten, ob Daten über den Serial Port gesendet werden. Wenn ja soll er die, zum Test, in einer MessageBox ausgeben.

Momentan habe ich das so gelöst:

public partial class Form1 : Form
 {
 public Form1()
 {
 InitializeComponent();
 serialPort1.Open();
 }

 private void serialPort1\_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
 {
 MessageBox.Show(serialPort1.ReadExisting());
 }

 private void Form1\_FormClosing(object sender, FormClosingEventArgs e)
 {
 serialPort1.Close();
 }
 }

In der Designer.cs Datei steht, dass „serialPort1“ folgende Standard-Eigenschaften hat: Baudrate: 9600, Datenbits: 8, StopBits: One, Parity: None, ReadBufferSize: 4096, ReadTimeOut: -1, ReceivedBytesThreshold: 1, etc.

Habe ich das so richtig gemacht?

Vielen Dank!
Gruß pcfreak92

Hallo,

Habe ich das so richtig gemacht?

Nun, funktioniert es denn? Bzw, was passiert denn?

Hallo,

Habe ich das so richtig gemacht?

Nun, funktioniert es denn? Bzw, was passiert denn?

Nun, ich kann es leider noch nicht testen, da mir noch ein Kabel fehlt :wink:
Dachte, dass vielleicht jemand da Erfahrung hat und da schnell durchschaut, ob das gut aussieht bzw. ob ich da noch was beachten sollte.

Gruß pcfreak92

Ich habe es jetzt getestet und es funktioniert!
Die Daten die empfangen werden, sind 10 Zeichern lang, aber in der MessageBox werden nur 8 ausgegeben. Wenn man dann auf „Ok“ klickt, dann wird in einer neuen MessageBox die letzten 2 Zeichen ausgegeben.
Da dies nur ein Test war, ist es nicht so schlimm…

Nun wollte ich, dass die Daten bei Empfang in eine TextBox geschrieben werden. Leider hat es mit

string daten = serialPort1.ReadExisting();

nicht geklappt. Der Compiler meint es handle sich um eine unbehandelte Ausnahme: „InvalidOperationException“, „Ungültiger threadübergreifender Vorgang: Der Zugriff auf das Steuerelement textBox1 erfolgte von einem anderen Thread als dem Thread, für den es erstellt wurde.“

Was muss ich tun, damit ich die Daten in die TextBox oder erstmal in eine Variable bekomme?

Vielen Dank!
Gruß pcfreak92

Hallo!

Die Eine Regel bei der Programmierung von Windows-Programmen ist, dass auf Steuerelemente ausschließlich von dem Thread aus zugegriffen werden darf, in dem diese erstellt wurden (i.d.R. der sog. UI-Thread).
Sonst passieren Schlimme Dinge™. :wink:
Der Empfang von Daten über den seriellen Port läuft in einem eigenen Thread, wenn Du diese Daten daher z.B. in eine TextBox bekommen willst, musst Du die Daten in den UI-Thread übertragen (dieser Vorgang wird als Marshaling bezeichnet).
Du musst also über Invoke() oder BeginInvoke() einen Delegaten aufrufen, der dann den Text der TextBox setzt.
Ok?

Gruß,
Martin