2013-07-20 46 views
1

我想使用串口在arduino和c#程序之间进行通信。我对c#编程很陌生。该程序有多个用户控制表单。每个人都需要访问串口发送数据。我需要做的就是从每个类的主窗体中写入串行端口。访问多个类的串行端口

我明白如何设置和写入串口。这里是我的Form1代码:

partial class Form1 : Form 
{ 
    lightsControl u1; 
    fanControl u2; 
    public Form1() 
    { 
     InitializeComponent(); 
     u1 = new lightsControl(); 
     u2 = new fanControl(); 
     u1.Dock = DockStyle.Fill; 
     u2.Dock = DockStyle.Fill; 
     serialPort1.PortName = "COM4"; 
     serialPort1.BaudRate = 9600; 
     serialPort1.Open(); 
    } 

    private void lightsButton_Click(object sender, EventArgs e) 
    { 
     u2.Hide(); 
     u1.Show(); 
     controlPanel.Controls.Add(u1); 
    } 

    private void fansButton_Click(object sender, EventArgs e) 
    { 
     u1.Hide(); 
     u2.Show(); 
     controlPanel.Controls.Add(u2); 
    } 

    private void monitorButton_Click(object sender, EventArgs e) 
    { 
     u1.Hide(); 
     u2.Hide(); 
    } 

    public void sendData(ref string tx1, ref string tx2, ref string tx3) 
    { 
     serialPort1.WriteLine(tx1); 
     serialPort1.WriteLine(tx2); 
     serialPort1.WriteLine(tx3); 
    }  
} 

我只有一个其他类写的到目前为止。我试图在继续其余部分之前获得串行通信设置。我创建了sendData函数希望能够从另一个类访问它,但我似乎无法得到这个工作。我使用Visual Studio 2012.

编辑: 它现在工作。这里是我的Form 1代码:

partial class Form1 : Form 
{ 
    lightsControl u1; 
    fanControl u2; 
    public Form1() 
    { 

     InitializeComponent(); 
     u1 = new lightsControl(serialPort); 
     u2 = new fanControl(); 
     u1.Dock = DockStyle.Fill; 
     u2.Dock = DockStyle.Fill; 
     serialPort.PortName = "COM4"; 
     serialPort.BaudRate = 9600; 
     serialPort.Open(); 
    } 

这里是我的第二个表单代码:

private SerialPort port; //declare port 
    public lightsControl(SerialPort port)//import serialPort from Form1 to port 
    { 
     InitializeComponent(); 
     this.port = port; 
     hideTimer(); 
     updateTimer.Enabled = true; 
     stopButton.Enabled = false; 
    } 

    public void WriteToPort(string data) 
    { 
     this.port.WriteLine(data); //function that writes to serial port 
    } 
    private void onButton_Click(object sender, EventArgs e) 
    { 
     statusLabel.Text = "Always On"; 
     hideTimer(); 
     switch (light) 
     { 
      case 0://Light 1 
       com = light1Name + "On"; 
       Tx2 = "a"; 
       WriteToPort(Tx2);//This is where I need to write to the port 
       light1Status = 1; 
       light1Reset(); 
       break; 

串口对象在Form1并其传递到正在使用的其他形式。

+0

任何错误。它到底在做什么? –

回答

1

我假设您的表单都是父表单的子表单,或者您的其他表单是Form1的子表单。在这种情况下,您可以在父类中创建SerialPort对象,并通过其构造函数将其发送给您的子类。

像这样:

private SerialPort port; 
public Form2(SerialPort port) 
{ 
    InitializeComponent(); 
    this.port = port; 
} 

// Use your port object throughout the class now. 
public void WriteToPort(string data) 
{ 
    this.port.WriteLine(data); 
} 

你会加载窗体2这样的:

Form2 form = new Form2(serialPort); 
form.Show(); 

基本上你创建你的SerialPort对象高在你的程序结构,并通过类的构造函数周围通过。

+0

谢谢,这对我有用。我更新了我的代码。 – bubba726

1

同一时间只能通过一个类连接到串口。所以你需要创建一个单例类并在其他类中使用它。

public class SerialPortClass 
{ 
    private SerialPort _serialPort = new SerialPort() ; 

    private SerialPortClass() 
    { 
     // you can set serialPort setting here 
    } 

    private static SerialPortClass _instance=new SerialPortClass(); 
    public static SerialPortClass Instance 
    { 
     get 
     { 
      return _instance; 
     } 
    } 


    private void Write() 
    { 
     _serialPort.Write(.....); 
    } 

现在用它在每个类是这样的:

SerialPortClass.Instance.Write();