Autor Beitrag
der_max
Hält's aus hier
Beiträge: 10



BeitragVerfasst: Mi 30.03.11 23:56 
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

ausblenden volle Höhe 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: Do 31.03.11 09:56 
Zitat:
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4796
Erhaltene Danke: 1059

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: 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 Threadstarter
Hält's aus hier
Beiträge: 10



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 110
Erhaltene Danke: 13

XP
C/C++/C#
BeitragVerfasst: Mo 04.04.11 00:45 
hier nur eine kleine anregung...

ausblenden volle Höhe 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:
        ...
        //das brauchst du nicht...
        CheckForIllegalCrossThreadCalls = false;
        ...

        private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            try
            {
                string serialIn;
                serialIn = serialPort1.ReadLine();
                //stattdessen invoke-methode der controls benutzen...
                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)
        {
            //port schließen...
            if(serialPort1 != null)
            {
                 if(serialPort1.IsOpen) serialPort1.Close();
                 serialPort1.Dispose();
            }
        }



gruß.