【问题标题】:C# run serial port data received event handler to another formC# 将接收到的串口数据事件处理程序运行到另一种形式
【发布时间】:2018-10-23 07:26:52
【问题描述】:

在我的 form1 中,我有 serialPort1,我想将 serialPort1_DataRecieved 运行到另一个表单。 或使用 form1 串行端口为 form2 创建 datarecieved 处理程序。

我正在使用此代码将我的串行端口传递给另一个表单。

 FOrm1 f1= new Form1(serialPort1);
 f1.Show();

这就是我想在我的 Form2 中做的事情

    SerialPort serialPort2;
    public delegate void myDelegate(string sData);
    public Form2(SerialPort SP)
    {
        InitializeComponent();
        serialPort2 = SP;
    }

    private void Form2_Load(object sender, EventArgs e)
    {
        try
        {
            serialPort2.Open();
            serialPort2.DataReceived += port_OnReceiveData;
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
        }

    }
   publicstatic void port_OnReceiveData(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
    {

        string sData;
        serialPort2.ReadTimeout = 20;

        try
        {
            sData = serialPort2.ReadLine();
            this.BeginInvoke((new myDelegate(Text_Out)), sData);
        }


        catch (Exception ex)
        {
        }

    }

我这样做解决了我的问题

【问题讨论】:

  • 将业务与 ui 层分离。将您的 serialPort 数据存储在一个通用数据存储中,可能会在新数据上触发事件,然后您可以从任何您喜欢的形式注册和请求数据。
  • 我可以使用那个serialPort2来做数据接收处理程序并将它运行到那个表单中吗?
  • 你能给我一些可能的解决方案吗?
  • 您只能同时将一个实例连接到一个串口。如果您尝试打开第二个连接,它将无法告诉您它已在使用中。

标签: c#


【解决方案1】:

这样做:只需在表单2上创建接口,然后在表单一中继承它,并将表单一设置为表单2的接口,然后从表单2调用接口中的方法,表单2

  public partial class Form2 : Form
    {
        public interface ABC
        {
             void OK(string data);
        }

        public ABC abc { get; set; } 

        public Form2()
        {
            InitializeComponent();
        }

        private void Form2_Load(object sender, EventArgs e)
        {

        }

        private void button1_Click(object sender, EventArgs e)
        {
            abc.OK("hi");
        }
    }

在你的表格 1

 public partial class Form1 : Form,ABC
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            Form2 f = new Form2();
            f.abc = this;
            f.Show();

        }

        public void OK(string data)
        {
            throw new NotImplementedException();
        }
    }

【讨论】:

  • 我想要的是使用串行端口以另一种形式运行 datarecieved 事件处理程序
  • 是的,您可以运行。假设 datarecieved 以您的表单 2 回调。在我的示例中,有一个 abc.OK("hi");使用 onclick 方法中的参数在 form2 中调用方法。(您可以在收到的数据回调中调用它。)它会立即调用表单 1 中的 ok 方法,并使用表单 2 中提供的参数
  • 您在 OK 方法中传递字符串吗?但为什么?我不需要传递一个字符串..我怎么能在这里调用 datarecieved 事件?
  • 我想你想用来自form2的参数调用form one的方法。我说的对吗?
  • 是的,我得到了我的解决方案,请参阅上面的更新问题,但我的问题现在我无法关闭或处置串行端口
【解决方案2】:

我这样做解决了我的问题

    SerialPort serialPort2;
    public delegate void myDelegate(string sData);
    public Form2(SerialPort SP)
    {
        InitializeComponent();
        serialPort2 = SP;
    }

    private void Form2_Load(object sender, EventArgs e)
    {
        try
        {
            serialPort2.Open();
            serialPort2.DataReceived += port_OnReceiveData;
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
        }

    }
   publicstatic void port_OnReceiveData(object sender, 
   System.IO.Ports.SerialDataReceivedEventArgs e)
    {

        string sData;
        serialPort2.ReadTimeout = 20;

        try
        {
            sData = serialPort2.ReadLine();
            this.BeginInvoke((new myDelegate(Text_Out)), sData);
        }


        catch (Exception ex)
        {
        }

    }

【讨论】:

  • 哦,太好了。你问怎么绑定事件。我错过了理解你的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-06-13
  • 2018-04-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-06
相关资源
最近更新 更多