2017-03-05 2 views
1

Ich muss Daten von COM in Form1 und dann wieder in Form2 lesen.C# COM Port schließen

Was wird der beste Weg sein?

In Form1 lesen Sie die COM Daten, dann mySerialPort.Close();, und in Form2 neue Verbindung öffnen?
Wenn so, wo in meinem Code oben sollte ich close es?

Oder schließen Sie nicht die COM? Wenn nicht schließen, wie kann ich die Daten in Form2 lesen?

namespace portreader 
{ 
    public partial class Form1 : Form 
    { 
     public Form1() 
     { 
      InitializeComponent(); 
     } 
     private void Form1_Load(object sender, EventArgs e) 
     { 
      SerialPort mySerialPort = new SerialPort(); 
      mySerialPort.PortName = "COM3"; 
      mySerialPort.BaudRate = 9600; 
      mySerialPort.Parity = Parity.None; 
      mySerialPort.StopBits = StopBits.One; 
      mySerialPort.DataBits = 8; 
      mySerialPort.Handshake = Handshake.None; 
      mySerialPort.DataReceived += new SerialDataReceivedEventHandler(mySerialPort_DataReceived); 
      mySerialPort.Open(); 
     } 

     string _buffer; 
     private void mySerialPort_DataReceived(object sender, SerialDataReceivedEventArgs e) 
     { 
      if (this.InvokeRequired) 
      { 
       // Using this.Invoke causes deadlock when closing serial port, and BeginInvoke is good practice anyway. 
       this.BeginInvoke(new EventHandler<SerialDataReceivedEventArgs>(mySerialPort_DataReceived), new object[] { sender, e }); 
       return; 
      } 
      SerialPort sp = (SerialPort)sender; 
      string data = sp.ReadExisting(); 

      _buffer += data; 
      if (_buffer.Length >= 8) 
      { 
       int chipnumber = Int32.Parse(_buffer, System.Globalization.NumberStyles.HexNumber); 
       Form2 form2 = new Form2(chipnumber); 
       form2.ShowDialog(this); 
       _buffer = null; 
      } 
     } 
    } 
} 
+1

Persönlich würde ich eine Klasse erstellen, die speziell Kommunikation Kommunikation für die Anwendung behandelt und beide Formulare verwenden. – itsme86

Antwort

1

Sie einfach die ComPort in einer Klasse wie

public class DataInput 
{ 
    public event Action<string> DataReceived; 

    private readonly SerialPort mySerialPort; 

    public DataInput(string portName) 
    { 
     mySerialPort = new SerialPort(); 
     mySerialPort.PortName = portName; 
     mySerialPort.BaudRate = 9600; 
     mySerialPort.Parity = Parity.None; 
     mySerialPort.StopBits = StopBits.One; 
     mySerialPort.DataBits = 8; 
     mySerialPort.Handshake = Handshake.None; 
     mySerialPort.DataReceived += new SerialDataReceivedEventHandler(mySerialPort_DataReceived); 
     mySerialPort.Open(); 
    } 

    private void mySerialPort_DataReceived(object sender, SerialDataReceivedEventArgs e) 
    { 
     string received = mySerialPort.ReadExisting(); 
     DataReceived?.Invoke(received); 
    } 
} 

jede Form Jetzt wickeln konnte (und auch andere Komponenten Ihrer Software) können Beschreiben Sie das Ereignis DataReceived einer Instanz von DataInput. So kann jede Komponente mit den Daten so umgehen, wie sie wollen. Daher haben Sie einfach eine Instanz von DataReceived und verwenden Sie es in Ihren Formularen wie zu erstellen:

public partial class Form1 : Form 
{ 
    private readonly DataInput dataInput; 

    public Form1() 
    { 
     InitializeComponent(); 
     dataInput = new DataInput("COM3"); 
     dataInput.dataReceived += OnDataReceived; 
    } 

    private void OnDataReceived(string Data) 
    { 
     //Do whatever you want with the data 
    } 
} 

Jetzt können Sie dataInput auf Ihre zweite Form übergeben und Sie können wieder die dataReceived Ereignis verwenden.

+0

Ich bin in C# neu, möchte Sie fragen, wenn Sie mir zeigen können, wie Sie das DataReceived in einem Formular verwenden und es schließlich wie folgt erhalten: _buffer + = DataReceived; – nordscan

+0

Ich habe meiner Antwort ein Beispiel hinzugefügt - hoffe, das hilft! – Fruchtzwerg

2

Sie müssen eine Klasse erstellen, die sowohl form1 als auch form2 verwenden können, und geben dann form1 und form2 einen Verweis auf diese Klasse.

Im Idealfall haben die Formulare keine Ahnung, dass es überhaupt eine serielle Schnittstelle gibt. Sie verwenden Ihre Klasse/Ihren Service nur, um Fragen zu stellen und Antworten zu erhalten. In dieser Klasse ist die Logik eingebettet, um zum seriellen Port zu gehen und die Abfragen auszuführen.

Dies ist eines der grundlegenden Designprinzipien von Software, das Ihre Benutzeroberfläche von Ihrer Anwendungslogik trennt.

siehe meine Antwort auf einen anderen Zusammenhang Beitrag

Serial Port Polling and Data handling