C#多个窗口使用用一个串口接受数据问题

我在主窗口MainForm中设置了Static SerialPort,在主界面注册了一个监听事件,然后在调到子界
之前,我注销了监听事件,
serialPort.DataReceived -= new SerialDataReceivedEventHandler(serial_DataReceived);

 然后在子界面Calibration中使用了SerialPort,然后重新设置了监听事件:
 MainForm.serialPort.DataReceived += new SerialDataReceivedEventHandler(DataReceived2);

想实现的方式是:在子窗口关闭之前将监听事件取消,然后在主界面在重新设置监听事件,关闭子窗口后主界面实现的代码
calibrationForm = new Calibration( );
calibrationForm.ShowDialog();
if (calibrationForm.DialogResult == System.Windows.Forms.DialogResult.OK)
{
serialPort.DataReceived += new SerialDataReceivedEventHandler(serial_DataReceived);
}

但是现在的结果是回到主界面后返回的数据仍然在子窗口事件监听器中显示(通过Console打印返回的数据大小)


求大神指点!!!

3个回答

当然是这样了,关闭子窗体的时候你又没有取消订阅 DataReceived2 这个事件,你搞来搞去一直在关注serial_DataReceived 这个事件
calibrationForm = new Calibration( );
calibrationForm.ShowDialog();
if (calibrationForm.DialogResult == System.Windows.Forms.DialogResult.OK)
{
serialPort.DataReceived += new SerialDataReceivedEventHandler(serial_DataReceived);
serialPort.DataReceived -= new SerialDataReceivedEventHandler(DataReceived2); //***************这句代码少了****************
}

ct872587129
智慧土狼 汗,找到原因了,我没有一一对应使用取消和订阅,还是很感谢您
一年多之前 回复
ct872587129
智慧土狼 MainForm.serialPort.DataReceived -= new SerialDataReceivedEventHandler(DataReceived2); this.DialogResult = DialogResult.OK;
一年多之前 回复
ct872587129
智慧土狼 可是我在子窗口关闭的事件中已经添加了你说的代码了:
一年多之前 回复

if (calibrationForm.DialogResult == System.Windows.Forms.DialogResult.OK)
{
//要先关闭之前设置的监听
serialPort.DataReceived -= new SerialDataReceivedEventHandler(DataReceived2);
serialPort.DataReceived += new SerialDataReceivedEventHandler(serial_DataReceived);
}

gao_chen
gao_chen 回复ct872587129: 怎么解决的呀。。我现在也是要用到你这个功能。子窗口关闭后,如何取消他的接收监听。如何给主窗体加监听
大约一年之前 回复
ct872587129
智慧土狼 已经解决,谢谢
一年多之前 回复
ct872587129
智慧土狼 但是还是出现这样的情况
一年多之前 回复
ct872587129
智慧土狼 谢谢,但是正如上面所说,我已经在子窗口的FormClosing事件中关闭了监听
一年多之前 回复

你在窗体定义串口接受事件,然后顶一个一个事件,show子窗体的时候挂载这个事件,子窗体关闭的时候注销

子窗体:
public class Form2 : Form {

        Form1 main;
        public Form2(Form1 mainform)
        {
            main = mainform;
            main.MsgEvent += Mainform_MsgEvent;
        }

        private void Mainform_MsgEvent(string obj)
        {
            //do something


        }

        protected override void OnClosing(CancelEventArgs e)
        {
            main.MsgEvent -= Mainform_MsgEvent;
            base.OnClosing(e);
        }
    }

            主窗体定义事件
               System.IO.Ports.SerialPort port = new System.IO.Ports.SerialPort();
    public event Action<string> MsgEvent;
            串口里边触发事件

        port.DataReceived += (o, eg) =>
        {
            //解析数据
            var data="":
            MsgEvent?.Invoke(data);
        };
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!