Witam.
Próbuje stworzyć aplikacje, której częścią będzie funkcjonalność rysowania wykresu na podstawie danych odebranych przez port szeregowy.
Konfiguracja UART, timer oraz obiekt serialPort umieściłem na form2, który wywoływany jest z poziomu form1. Wykres jest na form1. Dane z formu2 do form1 przesyłam przez odwołanie do obiektu. Program wysypuje się w momencie wyjscia z form2 ale tylko po skonfigurowaniu UARTa.

Błąd:

System.InvalidOperationException was unhandled
  HResult=-2146233079
  Message=Elementów Invoke lub BeginInvoke nie można wywołać w formancie do czasu utworzenia uchwytu okna.
  Source=System.Windows.Forms
  StackTrace:
       w System.Windows.Forms.Control.MarshaledInvoke(Control caller, Delegate method, Object[] args, Boolean synchronous)
       w System.Windows.Forms.Control.BeginInvoke(Delegate method, Object[] args)
       w ECUMaster_testing_software.Form2.serialPort1_DataReceived(Object sender, SerialDataReceivedEventArgs e) w c:\Users\Adam\Documents\Visual Studio 2013\Projects\ECUMaster testing software\ECUMaster testing software\Form2.cs:wiersz 98
       w System.IO.Ports.SerialPort.CatchReceivedEvents(Object src, SerialDataReceivedEventArgs e)
       w System.IO.Ports.SerialStream.EventLoopRunner.CallReceiveEvents(Object state)
       w System.Threading.QueueUserWorkItemCallback.WaitCallback_Context(Object state)
       w System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
       w System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
       w System.Threading.QueueUserWorkItemCallback.System.Threading.IThreadPoolWorkItem.ExecuteWorkItem()
       w System.Threading.ThreadPoolWorkQueue.Dispatch()
       w System.Threading._ThreadPoolWaitCallback.PerformWaitCallback()
  InnerException: 

Form1.cs:

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;

namespace ECUMaster_testing_software
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private Form2 form2 = new Form2();

        private void saveSetBUT_Click(object sender, EventArgs e)
        {
           
  
        }

        private void SetText(string text)
        {
            //this.rtbIncoming.Text += text;
        }



        private void openBT_Click(object sender, EventArgs e)
        {

        }

        private void aGauge1_ValueInRangeChanged(object sender, ValueInRangeChangedEventArgs e)
        {

        }

        private void trackBar1_ValueChanged(object sender, EventArgs e)
        {
           // aGauge1.Value = trackBar.Value;
        }

        private void startDrawBT_Click(object sender, EventArgs e)
        {
            form2.timer1.Start();
        }

        private void stopDrawBT_Click(object sender, EventArgs e)
        {
            form2.timer1.Stop();
        }


        private void konfiguracjaUARTToolStripMenuItem1_Click(object sender, EventArgs e)
        {
            form2.ShowDialog();   
        }


        private void wyjscieToolStripMenuItem_Click(object sender, EventArgs e)
        {
            Application.Exit();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            form2.frm1 = this;
        }



    }
}

Form2.cs:

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;

namespace ECUMaster_testing_software
{
    public partial class Form2 : Form
    {
        public Form2()
        {
            InitializeComponent();

            //--------------Setting default values of UART configuration---------------------
            baudRateCB.SelectedIndex = baudRateCB.FindStringExact("9600");
            dataBitsCB.SelectedIndex = dataBitsCB.FindStringExact("8");
            parityCB.SelectedIndex = parityCB.FindStringExact("None");
            stopBitsCB.SelectedIndex = stopBitsCB.FindStringExact("One");
            parityErrorCB.SelectedIndex = parityErrorCB.FindStringExact("63('?')");


        }

        private delegate void SetTextCallback(string text);
        private string InputData = String.Empty;
        private double yvalue;
        private double xvalue;
        private char serialArray;
        private Int32 offset = 0;
        private Int32 count = 8;
        public Form1 frm1;


        private void Form2_Load(object sender, EventArgs e)
        {
            string[] ArrayComPortsNames = null;
            int index = -1;
            string ComPortName = null;

           //Com Ports
           ArrayComPortsNames = SerialPort.GetPortNames();
            do
            {
               index += 1;
                portCB.Items.Add(ArrayComPortsNames[index]);
            } while (!((ArrayComPortsNames[index] == ComPortName) || 
              (index == ArrayComPortsNames.GetUpperBound(0))));
            Array.Sort(ArrayComPortsNames);

           if (index == ArrayComPortsNames.GetUpperBound(0))
            {
                ComPortName = ArrayComPortsNames[0];
            }

            //get first item print in text
            portCB.Text = ArrayComPortsNames[0];
        }

        private void SetText(string text)
        {
            //this.portCB.Text += text;
        }

        private void saveSetBUT_Click(object sender, EventArgs e)
        {
            serialPort1.BaudRate = Int32.Parse(baudRateCB.Text);
            serialPort1.DataBits = Int32.Parse(dataBitsCB.Text);
            serialPort1.Parity = (Parity)Enum.Parse(typeof(Parity), parityCB.Text);
            serialPort1.StopBits = (StopBits)Enum.Parse(typeof(StopBits), stopBitsCB.Text);
            serialPort1.PortName = portCB.Text;


        }

        private void openBT_Click(object sender, EventArgs e)
        {
            try
            {
                serialPort1.Open();
            }
            catch (UnauthorizedAccessException ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

        private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            InputData = serialPort1.ReadExisting();
            if (InputData != String.Empty)
            {
                this.BeginInvoke(new SetTextCallback(SetText), new object[] { InputData });
            }
            
        }


        private void Form2_FormClosing(object sender, FormClosingEventArgs e)
        {
            e.Cancel = true;
            this.Hide();
          
        }

        private void timer1_Tick(object sender, EventArgs e)
        {
           
            try
            {
                //serialPort1.Read(serialArray, offset , count);
                //if(serialPort1.IsOpen) trackBar.Value = Int32.Parse(serialPort1.ReadExisting());
                //frm1.chart.Series["Speed"].Points.AddXY(xvalue, yvalue);
              //  xvalue = xvalue + 100;
              //  yvalue = 50;
                //yvalue = frm1.trackBar.Value;
                Console.WriteLine("Liczy");
                dataFromTB.Text += InputData;
                frm1.testLabel.Text += InputData;
                
                //     trackBar.Value = numValue*10;
                //rtbIncoming.Text = numValue.ToString();


            }
            catch (Exception exeption)
            {
                Console.WriteLine("An error occured", exeption);
            }

        }

        private void button1_Click(object sender, EventArgs e)
        {
            frm1.testLabel.Text = dataFromTB.Text;
        }



    }
}