2016-02-04 66 views
-1

我正在編寫一個應用程序,該應用程序旨在從串行端口讀取數據,然後在圖形上繪製數據並將其保存到日誌文件中。到目前爲止,我正在進行初始串口設置和打開/關閉。使用多功能串口連接?

有一個組合框可以選擇要使用的串口,以及一個連接/斷開連接的按鈕。從串行端口斷開連接是重要的還是Windows在應用程序關閉時自動執行此操作?

下面的代碼:

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 FieldProbe 
{ 
    public partial class MainForm : Form 
    { 
     public MainForm() 
     { 
      InitializeComponent(); 
     } 

     private void MainForm_Load(object sender, EventArgs e) 
     { 
      var ports = SerialPort.GetPortNames(); 
      cmbSerialPorts.DataSource = ports; 
     } 

     private void btnConnect_Click(object sender, EventArgs e) 
     { 
      if (btnConnect.Text == "Connect") 
      { 
       btnConnect.Text = "Disconnect"; 

       if (cmbSerialPorts.SelectedIndex > -1) 
       { 
        MessageBox.Show(String.Format("You selected port '{0}'", cmbSerialPorts.SelectedItem)); 
        Connect(cmbSerialPorts.SelectedItem.ToString()); 
       } 
       else 
       { 
        MessageBox.Show("Please select a port first"); 
       } 
      } 
      else 
      { 
       btnConnect.Text = "Connect"; 
       port.Close(); 
      } 


     } 

     private void Connect(string portName) 
     { 
      var port = new SerialPort(portName); 
      if (!port.IsOpen) 
      { 
       port.BaudRate = 921600; 
       port.DataBits = 8; 
       port.StopBits = StopBits.One; 
       port.Parity = Parity.None; 
       port.Handshake = Handshake.None; 
       port.Open(); 
      } 
     } 

    } 
} 

它無恥地從幾個例子拍攝,我不是專家編碼器。 「port.close」行不起作用,似乎我無法從「連接」以外的任何其他功能訪問「端口」。從其他功能訪問此端口的最佳解決方案是什麼?

+2

您需要了解變量作用域 –

+0

在您的按鈕處理程序中,您將「active port」稱爲cmbSerialPorts.SelectedItem.ToString()(端口名稱atleast)。那麼爲什麼不做'var port = new SerialPort(cmbSerialPorts.SelectedItem.ToString()); port.Close();'?你也可以考慮將在'Connect()'中創建的'port'保存到一個數組中,或者把'port'作爲'private SerialPort'在這個類中(即改變'port'的範圍)。 –

+0

關閉您的應用程序將自動關閉您的端口 – Fruchtzwerg

回答

1

我建議你閱讀範圍 - 但基本上你是在Connect方法中創建一個端口。此變量對本方法是本地的,其他方法(如btnConnect_Click!)無法看到或訪問它。我建議你做端口變量的MainForm的類成員(宣佈它在同級別的方法,MainForm_Load) - 這樣所有的類方法可以訪問變量:

public partial class MainForm : Form 
{ 
    SerialPort _port; 

    public MainForm() 
    { 
     InitializeComponent(); 
    } 

    private void MainForm_Load(object sender, EventArgs e) 
    { 
     var ports = SerialPort.GetPortNames(); 
     cmbSerialPorts.DataSource = ports; 
    } 

    private void btnConnect_Click(object sender, EventArgs e) 
    { 
     if (btnConnect.Text == "Connect") 
     { 
      btnConnect.Text = "Disconnect"; 

      if (cmbSerialPorts.SelectedIndex > -1) 
      { 
       MessageBox.Show(String.Format("You selected port '{0}'", cmbSerialPorts.SelectedItem)); 
       Connect(cmbSerialPorts.SelectedItem.ToString()); 
      } 
      else 
      { 
       MessageBox.Show("Please select a port first"); 
      } 
     } 
     else 
     { 
      btnConnect.Text = "Connect"; 
      _port.Close(); 
     } 

    } 

    private void Connect(string portName) 
    { 
     _port = new SerialPort(portName); 
     if (!_port.IsOpen) 
     { 
      _port.BaudRate = 921600; 
      _port.DataBits = 8; 
      _port.StopBits = StopBits.One; 
      _port.Parity = Parity.None; 
      _port.Handshake = Handshake.None; 
      _port.Open(); 
     } 
    } 
} 
1

提供您的代碼是正確的和工作,唯一要做的就是將變量端口從本地變成函數,變成類的字段。這裏一個可能的解決方案:在類,那裏是外地聲明的開頭

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 FieldProbe 
{ 
    public partial class MainForm : Form 
    { 
     private SerialPort port; 
     public MainForm() 
     { 
      InitializeComponent(); 
     } 

     private void MainForm_Load(object sender, EventArgs e) 
     { 
      var ports = SerialPort.GetPortNames(); 
      cmbSerialPorts.DataSource = ports; 
     } 

     private void btnConnect_Click(object sender, EventArgs e) 
     { 
      if (btnConnect.Text == "Connect") 
      { 
       btnConnect.Text = "Disconnect"; 

       if (cmbSerialPorts.SelectedIndex > -1) 
       { 
        MessageBox.Show(String.Format("You selected port '{0}'", cmbSerialPorts.SelectedItem)); 
        Connect(cmbSerialPorts.SelectedItem.ToString()); 
       } 
       else 
       { 
        MessageBox.Show("Please select a port first"); 
       } 
      } 
      else 
      { 
       btnConnect.Text = "Connect"; 
       port.Close(); 
      } 


     } 

     private void Connect(string portName) 
     { 
      port = new SerialPort(portName); 
      if (!port.IsOpen) 
      { 
       port.BaudRate = 921600; 
       port.DataBits = 8; 
       port.StopBits = StopBits.One; 
       port.Parity = Parity.None; 
       port.Handshake = Handshake.None; 
       port.Open(); 
      } 
     } 
     private void OtherFunction() 
     { 
      if (port == null || !port.IsOpen) 
       return; 

      // HERE DO WHATEVER YOU WANT WITH port 
     } 
    } 
} 

注意了,在那裏是誰使用領域的虛擬函數結束。

+1

'private var port = new SerialPort(portName);'由於'portName'是一個未聲明的變量,因此將不會編譯。另外'var'在該範圍內是不允許的,現在它不能推斷出這個類型! ('var'只允許在函數本地範圍內) –

+0

是的,當我的手機響起時,我還在移動代碼,然後我按下了按鈕... 我從來沒有使用var ...我只是展示了原理。 –

+0

作爲我之前的答案,我建議使用一些東西來區分字段和變量。作爲其他用戶,我總是使用領域領先的不速之客。 –