2011-06-11 93 views
0

相同的serialport我有两种形式= Form1.cs和第一表上SMS.CS (Form1中)我已配置并准备工作serialport1。我有一个叫做发送消息的按钮。此按钮打开称为SMS.cs的新窗体。使用上两种不同的形式

private void SMS_Click(object sender, EventArgs e) 
    { 
     SMS settings = new SMS(); 
     settings.ShowDialog(); 
    } 

我想使用我配置的serialport1上窗体:Form1和窗体SMS.cs.这也可以从手机短信的形式接收数据,并使用serialport1发送Form1上,例如:

private void SMS_Click(object sender, EventArgs e) 
    { 
     SMS settings = new SMS(); 
     settings.ShowDialog(); 
     SerialPort1.Writeln(Data from form SMS) 
    } 

,但我不知道该怎么做。在我看来,最好的办法是直接从短信形式发送数据的..

编辑:

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 WindowsFormsApplication1 
{ 
    public partial class SMSForm : Form 
    { 
     SerialPort SerialP; 

     public SMSForm(Object SerialP) 
     { 
      InitializeComponent(); 
     } 

     private void button1_Click(object sender, EventArgs e) 
     { 
      SerialP.WriteLine("ATI"); 
     } 
    } 
} 

回答

0

Form1中是一个串口控制器 - 也就是Form1中配置的SerialPort。如果你有一个影响SerialPort的事件,比如`SerialPort1.Writeln',你应该将一个方法引用传递给对话框构造器。这将逻辑上保持班级分开,而共享方法。

您可以创建自定义EventArgs对象传递字符串返回到你的SerialPort:

public class WriteToSerialPortEventArgs : EventArgs 
{ 
    public WriteToSerialPortEventArgs (string Write) 
    { WriteBytes = Encoding.GetBytes(write); } // simplified - see MSDN for more options 

    public byte[] WriteBytes 
    { get; private set; } 
} 

Form1样本事件委托传递给您的短信对话:

void OnWriteToSerialPort(object sender, WriteToSerialPortEventArgs e) 
{ 
    SerialPort1.WriteLine(e.WriteBytes); 
} 

写您的短信构造:

// field 
Action<object, WriteToSerialPortEventArgs> writeDelegate; 

public SMS (Action<object, WriteToSerialPortEventArgs> writeDelegate) 
{ 
    this.writeDelegate = writeDelegate; 
    this.button1.Click += new EventHandler(button1_Click); 
} 

...短信事件代表:

void button1_Click(object sender, EventArgs e) 
{ 
    writeDelegate.Invoke(sender, new WriteToSerialPortEventArgs (txtBox.Text); 
} 

从技术上讲,您不需要完整的Invoke(...)方法签名。我把它的完整性和可写为:

writeDelegate(sender, new WriteToSerialPortEventArgs (txtBox.Text); 
1

要使用相同的SerialPort两种形式,您需要将引用一个串口发送到第二种形式。

最简单的方法是向接受SerialPort的SMS表单添加一个新的构造函数,将其存储在成员变量中并使用它。

地方,你

SMS settings = new SMS(); 

你需要真正做到这一点:

SMS settings = new SMS(SerialPort1); 
+0

我早些时候试图通过这种方式,但有错误:错误CS1729:“WindowsFormsApplication1.SMSForm”不包含一个构造函数1个参数 – Elfoc 2011-06-11 15:08:57

+0

@Elfoc:告诉我们你是如何定义构造函数的。错误信息表明你没有... – Andrei 2011-06-11 15:20:17

+0

我没有这样做:)在编辑我试图定义这个构造函数,但有问题:)我只有更多的时间基础知识.. :( – Elfoc 2011-06-11 15:38:05