2017-02-28 6 views
1

私のWindowsフォームアプリケーションの構造についていくつかアドバイスをしたいと思います。私のアプリケーションでは、USBデバイスからデータを読み取るためにユーザーがSerialPortを開くことができます。

現在、アプリケーションはメインフォームに開きます。ユーザーは別のフォームfrmPortConfigを開いてポートを設定すると、このフォームは閉じられ、ユーザーはメインフォームに戻ります。それが起きると、ユーザーはポートを選択してオープンし、ポート情報は別のポート構成クラスに渡され、セットアップされます。c# - アプリケーションの構造と渡しをシリアル形式のデータをメインフォームに戻す

どうすればこのデータをメインフォームに戻すことができますか?
これを達成するための正しい/最も効率的な方法ですか?

ポート設定フォーム:

public partial class frmPortConfig : Form 
{ 
    public frmPortConfig() 
    { 
     InitializeComponent(); 

     //center the form 
     this.CenterToScreen(); 
     //get serial ports 
     getPorts(); 
    } 

    public void getPorts() 
    { 
     //stop user from editing the combo box text 
     cmbPortList.DropDownStyle = ComboBoxStyle.DropDownList; 
     //get the available ports 
     string[] ports = SerialPort.GetPortNames(); 
     //add the array of ports to the combo box within the 
     cmbPortList.Items.AddRange(ports); 
    } 


    private void btnOpenPort_Click(object sender, EventArgs e) 
    { 
     //get name of port 
     string port = cmbPortList.SelectedItem.ToString(); 

     //if the port string is not null 
     if (port != null) 
     { 
      //if port can be opened (evoke open port code in port class) 
      if (clsPortConfig.openPort(port)) 
      { 
       //inform user that port has been opened 
       lblPortStatus.Text = port + " opened successfully"; 
      } 
      else 
      { 
       //inform user that port could not be opened 
       lblPortStatus.Text = port + " could not be opened"; 
      } 
     }   
    } 

    private void btnClose_Click(object sender, EventArgs e) 
    { 
     //close the form 
     this.Close(); 
    } 

ポートの設定クラス:

class clsPortConfig 
{ 

    public static bool openPort(string port) 
    { 
     try 
     { 
      //create new serial port 
      SerialPort serialPort = new SerialPort(); 

      //serial port settings 
      serialPort.PortName = port; 
      serialPort.BaudRate = 9600; 
      serialPort.Parity = Parity.None; 
      serialPort.StopBits = StopBits.One; 
      serialPort.Handshake = Handshake.None; 

      //attempt to open serial port 
      serialPort.Open(); 
      serialPort.ReadTimeout = 200; 

      //add data received handle to serial port 
      serialPort.DataReceived += new SerialDataReceivedEventHandler(serialPort_DataReceived); 

      //if serial port is now open 
      if (serialPort.IsOpen) 
      { 
       return true; 
      } 
      else 
      { 
       //inform user that the port could not be opened 
       return false; 
      } 
     } 
     catch 
     { 
      return false; 
     } 

    } 

    public static void serialPort_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e) 
    { 
     //set sender up as serial port 
     SerialPort serialPort = (SerialPort)sender; 

     //get data from serial port 
     string data = serialPort.ReadExisting();    
    } 
} 

がどのように私は私のメインフォームに戻って、受信したデータを送信する必要がありますか?

おかげ

答えて

1

は、どのように私は当時、メインフォームにこのデータを渡すでしょうか?

イベントを介してデバイスから非同期にデータを取得するためです。あなたはいつ到着するか分からない。だから、clsPortConfigから発砲できるイベントが必要です。

class clsPortConfig 
{ 

    public delegate void EventHandler(string s); 
    public static event EventHandler TransmitEvent; 

    // all the other stuff 

    public static void serialPort_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e) 
    { 
     //set sender up as serial port 
     SerialPort serialPort = (SerialPort)sender; 

     //get data from serial port 
     string data = serialPort.ReadExisting(); 

     if (TransmitEvent != null) 
     { 
      TransmitEvent(data); 
     } 
    } 

} 

、フォームに登録:

public frmPortConfig() 
{ 
    InitializeComponent(); 

    //center the form 
    this.CenterToScreen(); 
    //get serial ports 
    getPorts(); 

    clsPortConfig.TransmitEvent += MyTransmitEvent; 
} 

private void MyTransmitEvent(string s) 
{ 
    // in s you will find the data 
} 

これは、これを達成するための正しい/最も効率的な方法ですか?

私はそれを疑うでしょう。それを行う方法はたくさんあります。あなたはむしろ複雑なものを選びました。最も簡単なのはおそらくFormクラスのすべてを持つことでしょう。 SerialPortがあり、DataReceivedイベントを登録し、BeginInvokeメソッドを使用して、受信したデータを表示する場合はTextBoxのようなディスプレイコントロールにアクセスします。別のスレッドに到着するため、コントロールが作成されます。

+0

簡潔な回答ありがとうございます!私は私のフォームの周りにデータを渡す簡単な方法があることを知っていた。あなたは私の主な形の中でこれを全部やっているほうが良いのではないかと思いますか?私は別のクラスなどでそれを行うことによって私のコードクリーナーを作るだろうと思った。 –

+0

それは異なります。いくつかのコマンドを通信し、表示するだけの出力を受け取る小さなアプリケーションであれば、フォーム内のすべてを処理するだけで十分です。一方、別のPCにそれを配布したい場合は、アプリケーションがすぐに変更される可能性が高く、GUIをロジックから分離することをお勧めします。しかし、通信を扱うClassとそれ以外のものを別々のDLLプロジェクトに入れる必要があります。そのため、DLLファイルを交換するだけで、各アップデートで再コンパイルすることはできません。 –

関連する問題