У меня есть код, который я написал, который делает то, что я хочу.Однако я не совсем уверен, как именно это работает.Часть, с которой у меня больше всего проблем, это последняя часть.У меня был textBox1.Text = "test", который не работал.Я получил сообщение об ошибке во время выполнения вызова из другого потока.Когда я поставил textBox1.Invoke (и т. Д.), Он работал как положено.Зачем?
Как видите, я знаю достаточно, чтобы быть опасным, и я действительно хочу понять, что здесь происходит, вместо того, чтобы слепо копировать и вставлять сайты по всему Интернету.
У меня есть следующеев классе с именем SerialCommunicator:
public SerialCommunicator(SerialPort sp)
{
this.sp = sp;
sp.ReceivedBytesThreshold = packetSize;
sp.DataReceived += new SerialDataReceivedEventHandler(sp_DataReceived);
sp.Open();
}
public void sp_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
Thread.Sleep(50);
SerialPort s = (SerialPort)sender;
byte[] buffer = new byte[128];
s.Read(buffer, 0, s.BytesToRead);
}
Затем в моем Form1.cs у меня есть кнопка, которая при нажатии делает следующее:
private void btnPortOK_Click(object sender, EventArgs e)
{
string comPort = cboComPorts.SelectedItem.ToString();
SerialPort sp = new SerialPort(comPort, 9600, Parity.None, 8, StopBits.One);
sp.DataReceived += new SerialDataReceivedEventHandler(DataHasBeenReceived);
comm = new SerialCommunicator(sp);
}
public void DataHasBeenReceived(object sender, EventArgs args)
{
textBox1.Invoke(new EventHandler(delegate { textBox1.Text += "test"; }));
}