prenixd
prenixd

Reputation: 43

Sharing Serial Port across multiple Forms C# VB

I have three Forms in my project. Form2 Connects the Serial Port. Form1 writes and reads data from the Serial Port. Form 3 only needs to write to the serial port, however when i send data to the serial port I get an "Port is closed error". I do not see any difference in the way i set up form 2 and form 3 so i am not sure why Visual Studios is giving me the "port closed" error.

Form 2 will connect to serial port

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.IO.Ports; // added this 

namespace ECE_323_LAB_10
{
   
    public partial class Bluetooth_Settings : Form
    {
        public  SerialPort _serial = new SerialPort(); // added this 
        public Bluetooth_Settings()
        {
            InitializeComponent();
            _serial.BaudRate = int.Parse(baud_rate.Text); // added this 
            foreach (string s in SerialPort.GetPortNames()) // added this 
            {
                com_port.Items.Add(s);
            }
        }

        private void connet_button_Click(object sender, EventArgs e)
        {
            try
            {
                _serial.PortName = com_port.SelectedItem.ToString();
                _serial.BaudRate = Convert.ToInt32(baud_rate.SelectedItem);
                _serial.Open();
                this.Close();
                Form1 _main = new Form1();
                foreach (Form1 tmpform in Application.OpenForms)
                {
                    if (tmpform.Name == "Form1")
                    {
                        _main = tmpform;
                        break;
                    }
                }


                _main.toolStripStatusLabel1.Text = " Connected: " + _serial.PortName.ToString();
                _main.toolStripStatusLabel1.ForeColor = Color.Green;
                _main.toolStripProgressBar1.Value = 100;
            }
            catch
            {
               MessageBox.Show("Please select COM Port/ Baud Rate");
            }            
        }

       
    }
}

Form1 can read and write data to serial port

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.IO.Ports;
using ZedGraph;
using System.Text.RegularExpressions;

namespace ECE_323_LAB_10
{
    
    public partial class Form1 : Form
    {
        PointPairList list = new PointPairList();
        double temp;
        int flag = 1;
        double x = 0;
        int init = 0;
        int digit = 0;
        double temp1;
  
       
        private T_settings t_settings;


        private Bluetooth_Settings _setting = new Bluetooth_Settings();
        public Form1()
        {
            InitializeComponent();
        }

        private void richTextBox1_TextChanged(object sender, EventArgs e)
        {
            
            int text_length = 0;
            
            text_length = richTextBox1.TextLength;
            char send_ch = richTextBox1.Text[text_length - 1]; // extracting the last character
            char[] ch = new char[1];
            ch[0] = send_ch;
            if (send_ch == '\n')
            {
                _setting._serial.Write("\r"); // sending carraige return 
            }
            else
            {
                _setting._serial.Write(ch, 0, 1); // sending char to microcontroller
            }
        }



        private void Toggle_Click(object sender, EventArgs e)
        {
            // 2 = F , 1 = C

            char[] ch = new char[1];
            
            
                ch[0] = 'D';
                
                _setting._serial.Write(ch, 0, 1); // sending char to microcontroller
              
          
        }


    
        private void Settings_Click(object sender, EventArgs e)
        {
            t_settings = new T_settings();
            t_settings.Show();
        }

      
    }
}

Form1 has no errors when i read and write to the serial port. I have left a few lines of codes out for readability.

Now here is the code for Form3, I think i have done setup exactly the same as Form1, however I am getting port is closed error.

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.IO.Ports; // added this 

namespace ECE_323_LAB_10
{
     
    public partial class T_settings : Form
    {

        private Bluetooth_Settings _enter = new Bluetooth_Settings();
        
        public T_settings()
        {
            InitializeComponent();
           
        }
        string Sampling_text;
     
        
        private void Text_Sampling_TextChanged(object sender, EventArgs e)
        {

            Sampling_text = Text_Sampling.Text;
        }

        private void Send_Sampling_Click(object sender, EventArgs e)
        {
            

            int text_length = 0;

            text_length = Sampling_text.Length;
            char send_ch = Text_Sampling.Text[text_length - 1]; // extracting the last character
            char[] ch = new char[1];
            ch[0] = send_ch;
            if (send_ch == '\n')
            {
                _enter._serial.Write("\r"); // sending carraige return 
            }
            else
            {
                _enter._serial.Write(ch, 0, 1); // sending char to microcontroller
            }

            char[] enter = new char[1];


            

        }
    }
}

Can someone tell me what I need to add to Form3 so I do not get a port closed error. In my send sampling click method.

Upvotes: 1

Views: 386

Answers (1)

Jeremy Thompson
Jeremy Thompson

Reputation: 65554

Ok, if you're totally new then concepts around OOP will take time to learn. Let me try and give you a solution to get you out of trouble.

 private T_settings t_settings = null;

 private Bluetooth_Settings _bsSettings = null;
 public Form1()
 {
    InitializeComponent();

    if (_bsSettings == null) _bsSettings =  new Bluetooth_Settings();
    _bsSettings.Show();
 }

 private void Form1_Shown(Object sender, EventArgs e) {
 {
    //Either here or in the constructor instantiate T_settings with a reference to the 
    //_bsSettings this way it will still be in scope, the same instance you've connected.
    if (t_settings == null) t_settings = new T_settings(_bsSettings);
 }

public partial class T_settings : Form
{
    private Bluetooth_Settings _bsSettings = new Bluetooth_Settings();
    
    public T_settings(Bluetooth_Settings bsSettings)
    {
        InitializeComponent();
        
        //Pass a reference of the BS Settings class (one that's already connected)
        this._bsSettings = bsSettings;
       
    }

...

    private void Send_Sampling_Click(object sender, EventArgs e)
    {
        int text_length = 0;

        text_length = Sampling_text.Length;
        char send_ch = Text_Sampling.Text[text_length - 1]; // extracting the last character
        char[] ch = new char[1];
        ch[0] = send_ch;
        if (send_ch == '\n')
        {
            _bsSettings._serial.Write("\r"); // sending carraige return 
        }
        else
        {
            _bsSettings._serial.Write(ch, 0, 1); // sending char to microcontroller
        }
    }

Upvotes: 1

Related Questions