2017-02-28 1 views
1

Ich möchte einige Hinweise zur Struktur meiner Windows-Formular-Anwendung. Meine Anwendung ermöglicht es dem Benutzer, eine SerialPort zu öffnen, um Daten von einem USB-Gerät zu lesen.

Derzeit wird die Anwendung in das Hauptformular geöffnet, der Benutzer würde dann ein anderes Formular frmPortConfig öffnen, um den Port zu konfigurieren, würde dieses Formular dann geschlossen sein und der Benutzer würde zum Hauptformular zurückkehren. So wie es aussieht, wählt der Benutzer den Port, klickt auf Öffnen, die Port-Information wird dann an eine andere Port-Konfigurationsklasse übergeben und wird eingerichtet.C# - Anwendungsstruktur & Weitergabe der gelesenen seriellen Daten zurück zu meinem Hauptformular

Wie würde ich dann diese Daten an das Hauptformular zurückgeben?
Ist dies die richtige/effizienteste Methode, um dies zu erreichen?

port config Form:

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

port config Klasse:

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

Wie soll ich die empfangenen Daten zurück zu meinem Hauptformular senden?

Dank

Antwort

1

wie würde ich diese Daten dann an die Hauptform weiterzugeben?

Da Sie die Daten asynchron vom Gerät über ein Ereignis abfangen. Du weißt nicht, wann es ankommen wird. Sie benötigen also ein Ereignis, das Sie aus dem clsPortConfig auslösen können.

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

} 

und sie in Form registrieren:

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 
} 

Ist dies die richtige/effizienteste Methode, dies zu erreichen?

Ich würde das bezweifeln. Es gibt viele Möglichkeiten, dies zu tun. Sie haben sich für einen ziemlich verworrenen entschieden. Am einfachsten wäre es wahrscheinlich, alles in der Klasse Form zu haben. Haben Sie die SerialPort dort, registrieren Sie das DataReceived Ereignis auch und verwenden Sie die BeginInvoke Methode, um Display-Steuerelemente wie TextBox zuzugreifen, wenn Sie die empfangenen Daten anzeigen möchten. Da es in einem anderen Thread ankommen wird, wird das Steuerelement in erstellt.

+0

Vielen Dank für Ihre knappe Antwort! Ich wusste, dass es eine einfache Möglichkeit geben würde, die Daten um meine Formulare herum zu übertragen. Denkst du, dass es mir eigentlich besser geht, alles in meiner Hauptform zu machen? Ich dachte, es würde meinen Code sauberer machen, indem ich es in separaten Klassen usw. machen würde. –

+0

Es kommt darauf an. Wenn es nur eine kleine Anwendung ist, um ein paar Befehle zu kommunizieren und eine Ausgabe zu erhalten, die Sie nur anzeigen, dann würde es genügen, alles im Formular zu behandeln. Wenn Sie andererseits es auf verschiedenen PCs verteilen möchten und die Wahrscheinlichkeit hoch ist, dass sich die Anwendung bald ändert, ist es oft ratsam, die GUI von der Logik zu trennen. Aber dann müssten Sie die Klasse, die die Kommunikation und alles andere behandelt, in ein separates DLL-Projekt einfügen. So können Sie nur die DLL-Datei austauschen und nicht bei jedem Update neu kompilieren. –

Verwandte Themen