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;
}
}
}