Entwickler-Ecke
Sonstiges (.NET) - IOExeption bei SerialPort.ReadLine();
der_max - Mi 30.03.11 23:56
Titel: IOExeption bei SerialPort.ReadLine();
Hallo zusammen!
Ihr habe mir gestern schon sehr geholfen, ich habe noch ein weiteres Problem, vielleicht weiß jemand dazu etwas zu sagen. Ich entschuldige mich nochmals füt die Anfängerfragen, wer davon genervt ist, überlese sie einfach... ;-)
Ich habe mit u.g. Code das Problem, dass ich beim Schließen der Form hin und wieder (nicht immer) die Fehlermeldung "Der E/A-Vorgang wurde wegen eines Threadendes oder einer Anwendungsanforderung abgebrochen." kassiere. Ich habe keine exakte Idee, woran das liegt, und vor allem, was ich dagegen tun kann. Hängt es damit zusammen, dass der Eventhandler für "DataReceived" noch ausgeführt wird, obwohl das serial Objekt schon geschlossen ist, o. ä.?
Danke für alle Tipps!
Max
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77:
| using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.IO.Ports;
namespace rs232_test01 { public partial class Form1 : Form {
private int _serConnected = 0; private int[] _posStps = new int[4]; public Form1() { InitializeComponent(); }
private void Form1_Load(object sender, EventArgs e) { CheckForIllegalCrossThreadCalls = false; serialPort1.BaudRate = 9600; serialPort1.DataBits = 8; serialPort1.Parity = Parity.None; serialPort1.StopBits = StopBits.One; serialPort1.PortName = "COM4"; serialPort1.NewLine = "\r\n"; }
private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e) { try { string serialIn; serialIn = serialPort1.ReadLine(); listBox1.Items.Add(serialIn); label1.Text = serialIn; } catch { MessageBox.Show("Ein IO-Fehler ist aufgetreten"); }
}
private void button1_Click(object sender, EventArgs e) { if (_serConnected == 0) { serialPort1.Open(); serialPort1.Write("r"); button1.Text = "Disconnect"; _serConnected = 1; } else { serialPort1.Write("s"); serialPort1.Close(); button1.Text = "Connect"; _serConnected = 0; } }
private void Form1_FormClosed(object sender, FormClosedEventArgs e) { serialPort1.Close(); }
} } |
Kha - Do 31.03.11 09:56
Zitat: |
C#-Quelltext 1:
| CheckForIllegalCrossThreadCalls = false; | |
Autsch! Du bringst dich in Teufels Küche, bitte such doch einmal nach Control.Invoke.
Zum Fehler kann ich nicht viel sagen, aber wo tritt er denn auf? Kannst du ihn nicht abfangen?
Th69 - Do 31.03.11 10:45
Hallo der_max,
schau doch mal im Debugger nach, von wo die DataReceived-Methode dann aufgerufen wird (mittels des Fensters "Call Stack" bzw. auf deutsch "Aufrufliste").
Verwendest du denn mehrere Threads?
der_max - Do 31.03.11 22:02
Hallo,
danke für die Hinweise. Ich kenne mich mit der Thread-Programmierung noch nicht aus, lese mich da gerade ein... Den Fehler abfangen tue ich, aber deswegen tritt er ja trotzdem auf, ich dachte, ich hätte vielleicht einen offensichtlichen Fehler gemacht. Durch das Abfangen läuft das Programm jetzt im Prinzip, insofern vertage ich das Problem erstmal (hab nämlich leider noch weitere...).
In der Aufrufliste steht übrigens nur:
rs232_test01.exe!rs232_test01.Form1.serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e) Zeile 58 C#
...mit der Info kann ich aber im Moment in Bezug auf das geschilderte Problem noch nicht so viel anfangen. Aber wie gesagt, ich melde mich ggf. in dieser Sache nochmal, mache jetzt erstmal an anderer Stelle weiter.
Danke nochmal!
Max
Dr. Hallo - Mo 04.04.11 00:45
hier nur eine kleine anregung...
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31:
| ... CheckForIllegalCrossThreadCalls = false; ...
private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e) { try { string serialIn; serialIn = serialPort1.ReadLine(); listBox1.Invoke(new EventHandler(delegate { listBox1.Items.Add(serialIn); })); label1.Invoke(new EventHandler(delegate { label1.Text = serialIn; })); } catch { MessageBox.Show("Ein IO-Fehler ist aufgetreten"); }
}
private void Form1_FormClosed(object sender, FormClosedEventArgs e) { if(serialPort1 != null) { if(serialPort1.IsOpen) serialPort1.Close(); serialPort1.Dispose(); } } |
gruß.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!