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打印返回的数据大小)


求大神指点!!!
1

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); //***************这句代码少了****************
}

0
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);
}

0
gao_chen
gao_chen 回复ct872587129: 怎么解决的呀。。我现在也是要用到你这个功能。子窗口关闭后,如何取消他的接收监听。如何给主窗体加监听
10 个月之前 回复
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);
        };
0
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
【C#】不同窗体如何调用同一个串口
如果是在Form1里 那么加上 public static 则其他窗口可以通过Form1.serialPort1来引用它 当然 更好的是放在另一个静态类里 比如 public static class CommonRes { public static SerialPort serialPort1; } 只要using了这个类的命名空间 这样任何窗体内都能用Commo...
实现一个串口被多个Form窗体调用的功能
很简单,是我自己摸出来的,不要用c#自带的serialPort控件,自己定义一个静态实例即可。  public static SerialPort serialPort1 = new SerialPort(); 然后连接虚拟串口COM3:  private void bt_connectPlc_Click(object sender, EventArgs e)
c#串口接收数据之后同时发送另外两个虚拟串口
c#串口接收数据之后同时发送另外两个虚拟串口,虚拟串口供另外两个程序使用,解决一个串口数据库多个程序同时读取问题
c#多串口多线程接收数据
因为前段时间需要用到串口接收数据,且使用的串口号不确定,需采用多线程的方式来实现接收。 创建线程: Thread thread = null; for (int i = 0; i < PortNum; i++)//根据选择的串口号数量创建对应数量的线程 { thread = new Thread(Text_Ru
C#界面设计-1-PC串口发数据界面
PC串口发数据界面1、通过不同的串口来发送数据:using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows...
一个简单方法解决串口接收一包完整数据问题
     最近在写C#的串口时,明明是一包数据SerialPort事件非要产生一次或者多次事件来接收,导到一包数据分成两包数据 ,后来改成线程处理。废话不多说直接上程序。 如果有问题可以直接回复,谢谢,延时时间不一定是10ms,如果要求更高可以减少延时时间。 public partial class mainWin : Form { const int dataMaxLen = 10...
C# 解决串口接收数据不完整
使 用缓存机制完成。首先通过定义一个成员变量List buffer = new List (4096);用来存放所有的数据,在接收函数里,通过buffer.AddRange()方法不断地将接收到的数据加入到buffer中,并同时对 buffer中的数据进行检验,如果达到一定的长度并且校验结果正确(校验方法在发送方和接收方一致),再进行处理。具体代码如下:代码 private List buffer
C#多串口通信数据接收处理
本源码在VS2013平台上,使用C#编程,实现了多串口通信的数据接收处理,实用性强,代码简洁,内置使用说明
串口程序接收数据一段时间后出现乱码
发送端数据太快的问题 需要在发送端加延时;   用这个东西监控一下端口状况: http://technet.microsoft.com/zh-cn/bb896644.aspx [/Quote] 我用过一个串口跟踪器一样的东西,但是这个东西也只是从我的缓存里面读取数据,跟我编的程序读数据的结果是一眼的啊. 用串口监控软件监控串口,在出现乱码的时候先确定下是发送的问题还是接收到问题
关于串口通讯每次只能接收8个字节
这两天在某嵌入式系统做了个串口通讯程序,遇到了每次只接收8个字节的问题。相信很多人都遇到了。 上网一查资料,找到串口配置结构体struct termios中的c_cc[VTIME] 和 c_cc[VMIN]参数。 c_cc[VTIME]   // 等待时间,单位百毫秒  c_cc[VMIN]     // 最小字节数  VMIN自然就是最少接收的字节数了。那不足VMIN的话怎么办呢
C# 使窗体控件接受拖拽数据
.............(此处待补全1万字介绍) 实现步骤: 1、设置控件 AllowDrop 属性为 True 2、添加控件 DragEnter 事件(当数据拖拽进入控件区域时触发该事件) private void Form1_DragEnter(object sender, DragEventArgs e) {     // 验证拖拽到数据格式,此处验证拖拽数据是否为文件
基于C# Winform的串口数据接收
很多初学者在接触到串口编程时,不知道如何入手,找了网上一些文章,也是鱼龙混杂,不好学习。 今天,我分享一篇文章,讲述 基于C# Winform的串口数据接收编程(适合大概明白WinForm编程的同学,没有接触过WinForm的同学下载源码学习)
串口通信中接收数据时延迟处理与缓存处理的解决方案(C#)
利用串口进行通信,当发送方(A)将数据写入串口后,通过无线或有线方式将数据传送给接收方(B),B通过调用串口读方法comm.read(参数)即可将数据读出。原理十分简单,但最近在利用串口处理SM-42无线传输时,数据总是一段一段的传到B,并不能在comm_DataReceived方法中单纯使用read方法将数据接收完全。我知道用缓存机制,但由于经验少(正在实习),到网上找了找大牛们的方法,并结合自
C#----串口数据接收发送
虚拟串口驱动工具,创建俩个虚拟串口,如图:   创建两个Console模拟串口的发送接收数据 C#串口数据接收发送,类空间: using System.IO.Ports;   C# 串行端口 接收数据,代码如下: //遍历串行端口名称数组 foreach (string port in System.IO.Ports
c#中 一个窗口中需要使用另一个窗口中的控件名称
jiashe 一种在控件中写一个
C#通讯编程入门--串口数据接收发送实例
转自:http://www.cnblogs.com/bmbh/p/3795774.html 虚拟串口驱动工具,创建俩个虚拟串口,如图:   创建两个Console模拟串口的发送接收数据 C#串口数据接收发送,类空间: using System.IO.Ports;   C# 串行端口 接收数据,代码如下: /
C#上位机串口接收温度数据
VS2010C#工程,接收单片机系统串口传输的4字节温度数据并显示,附带数据库查询指令参考
C#中串口接收数据触发事件
当使用串口接收数据的时候,会用到下列语句:      serialPort.DataReceived += new SerialDataReceivedEventHandler(port_DataReceived); 而当接收到数据时,调用port_DataReceived函数。 其中:    1)serialPort.DataReceived 是一个事件(Event);
C# 串口通信(彻底解决C#串口通信中的数据丢失问题)
以网上某位大虾的源码为版本,沿用了其可用的代码部分。对其余欠妥部分进行了改造。不要资源分,是大家不用为积分而烦恼。出来混都不容易,希望大家相互照应!
C#串口通信-向串口发送数据,同步接收返回数据
最近写C#串口通信程序,系统是B/S架构。SerialPort类有一个DataReceived事件,用来接收串口返回的数据,但这种方式在C/S架构下很好用,但B/S就不好处理了。所以写了一个同步模式接收返回数据的方法,不使用DataReceived事件。经过测试,可以正常使用(不支持多线程调用)。     一、Machine类     1、Machine类有一个静态变量,定义如下: pr
C#上位机制作之串口接受数据(利用接受事件)
前面设计好了界面,现在就开始写代码了,首先定义一个串口对象..SerialPort serialport = new SerialPort();//定义串口对象添加串口扫描函数,扫描出来所有可用串口显示在下拉框中,同时设置接受函数string[] ArryPort = SerialPort.GetPortNames(); comboBox1.Items.Clear(); ...
C#委托的使用和串行通讯接收事件显示在指定控件
本实例演示定义委托,并利用委托把来自串口接收到的数据显示在文本框中!熟悉委托的定义和串行数据收发的简单功能! 项目代码: using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using Syste
stm32中串口接收不定字节数据
平台:STM32ZET6(核心板)+ST-LINK/V2+USB串口线+SIM800C+杜邦线(用于连接SIM800C和STM32开发板)    串口接收不定长数据采取的思路是:在STM32内存中设置一个缓存区(数组),在中断中将数据逐个放入到缓存区中,然后判断一帧数据是否接收完成。    关键点:如何判断一帧数据是否接收成功?    思路:利用IDLE中断判断接收一帧数据完成,其中IDLE中断是...
winForm串口接收的中文乱码问题
解决方法 在串口初始化中设置编码方式: serialPort1.Encoding = System.Text.Encoding.GetEncoding("UTF-8");//根据实际情况选择UTF-8还是GB2312
【C#】串口传输中文字符
发送: Encoding gb = System.Text.Encoding.GetEncoding(&quot;gb2312&quot;); byte[] bytes = gb.GetBytes(&quot;中文&quot;); serialPort1.Write(bytes, 0, bytes.Length); 接收: int ilen = serialPort1.BytesToRead; byte[]...
stm32使用两路串口及接收不定长数据的实现
前言:前一段时间需要编写一个使用双路串口的程序采集传感器数据,由于自身能力有限所以遇到了很多坑,后来经过多方学习和调试基本完成了所需功能,现将自己的一些经(踩)验(过)方(的)法(坑),与大家分享。由于本人水平有限文章中有不足之处也欢迎大家指出改正! 1、串口配置 本人采用的是stm32F407的串口1和串口3(串口2因为硬件问题让我给烧坏了…尴尬, 在此也提醒大家一定要确保硬件
C#中SerialPort串口控件使用之字符的接收
好久没写东西了,工作时没什么事干,也就看看书;以前就对串口通信感点兴趣,serialport控件也看了几天,想做一个类似串口助手的东西,由于是刚看的C#,很多东西都不知道,网上的SerialPort控件要不讲得不清楚,要不代码错误;所以把自己看到的学到的供大家分享! 注:我这里写的是SerialPort串口控件使用之字符的接收,用到的工具为VS2010,串口调试助手,VSPD(虚拟串口)6.9,
一个串口同时传输多个数据
程序目标:实验中在调试程序时,需要在只用到一个串口的条件下,用上位机同时向单片机传送多个不同数据。 实现原理:1,用LabView编写的上位机,使用VISA向单片机中写入数据;多个数据之间用一些分隔符进行区分。 2,定义一个字符串USART_RX_BUF[]接收收据,然后在该字符串中查找相应的分隔符并得到它们在字符串中的位 置,最后根据这些位置从字符串中提取
串口通信多线程接收数据,发送数据
串口通信,多线程接收数据,并可以发送数据
stm32f103串口的IDLE中断接收不定长数据
通过RXNE和IDLE中断接收不定长数据,完美实现不定长数据的接收
C#多线程操作WPF GUI控件,串口数据接收发送
运行环境为VS2015,如果直接在多线程中操作GUI会报错,在.net中,可以通过Dispatcher.Invoke来委托进行操作具体用法示例:节选自该程序中接收下位机发送数据并显示的代码1.先在其他函数中创建并启动线程ThreadStart threadStart = newThreadStart(ReceiveData);//ThreadStart是一个委托,创建一个线程来在后台接收数据   ...
C#对串口数据接收的处理
总体借鉴博客园的,虽然知道模式,但是借鉴了别人的写法:点击打开链接 个人的意见与思路: 1.先获取足够的数据信息。 2.判断帧头,获取需要的数据信息 3.帧尾结束,执行下一次判断 4.移除处理过的数据 使 用缓存机制完成。首先通过定义一个成员变量List buffer = new List (4096);用来存放所有的数据,在接收函数里,通过buffer.AddRange()方
C# serialport 串口发送与接收数据操作类
对C#的serialport类功能进行了总结,给出了发送,接收数据的完整操作类代码,可直接运用该类进行c#的串口数据操作
C# 串口通讯的数据丢失和同步异步问题
串口通讯最痛苦的在于无法深入了解串口内部的规则,只能调用c#提供的SerialPort类,但是使用的时候也出现了很多问题,有的是自身的有的是由于不了解造成的。 首先SerialPort类提供了很多很好的方法,对于读写都很有帮助,但是有的读是同步,有的是异步,同步就是和主程序保持一致,只有运行完了ReadByte之后才能运行程序之后的代码,异步就是重新开启一个线程来处理这些问题,主程序不受
51单片机串口和模拟串口收发多个数据程序(汇编)
用汇编语言编写的51单片机串口和模拟串口收发多个数据程序。单片机自带串口作为串口1,与上位机通讯。用外部中断模拟串口作为串口2,与现场仪表通讯。从单片机初始化到各个单元子程序均有。方便开发者使用。改程序经过现场测试,并使用在某RTU中。
C#串口通信时丢失数据的一种解决方法
<br />刘凯 周云耀 <br />武汉理工大学信息工程学院 武汉市(430070) <br />E-mail: lk.6@163.com <br />摘要:C # 串行类( SerialPort )是.NET Framework version 2.0中一个新增的类,该类将串口操作了封装,从而为串口通信提供了简便方法,而且具有功能强大、通信快速、实时性好等特点。但在实际串口通信的应用中,在串口高波特率大信息量的数据通信时,会出现丢失数据的问题。此时如果只是增加串口类的缓存容量是不能根本解决问题的。本文就
安卓 关于接收串口数据的问题
我用InputStream读串口数据,会丢失一部分数据,我是设置的每次读1160大小的数据,每次都会丢失最后几个字节的数据,难道我缓存数据会在没读完的情况下自动清空吗?下面是我用到的代码:                                         int buffersize = 1160; byte[] buffer1=new byte[buffersize]; in
C#串口接收字符与数值的切换
private void port_DataReceived(object sender, SerialDataReceivedEventArgs e) { if (!radioButton2.Checked)//判断是否选中了字符选项 { string str = serialPort1.ReadEx...
串口通信中,解决serialport.DataReceived接收到的数据不完整
private SerialPort serialport = new SerialPort(); private StringBuilder builder = new StringBuilder(); // private StringBuilder bs = new StringBuilder();//用于存储一条完整信息; Boolean op
C# 串口接收数据
using System; using System.IO.Ports; using System.Text; using System.Threading; using System.Windows.Forms; namespace Serial { public partial class Form1 : Form { public Form1() ...
文章热词 机器学习教程 Objective-C培训 交互设计视频教程 颜色模型 设计制作学习
相关热词 mysql关联查询两次本表 native底部 react extjs glyph 图标 学习大数据用用学习编程吗 产品经理最想接受的培训