2011-06-11 142 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